C# - 多态混淆重载和方法隐藏

Gil*_*ams -2 c#

我有一个名为Itemclass的类,它作为一个抽象类,但没有定义为一个.这个类有一个MaxPerStack属性:

public class Item
{
    public short MaxPerStack
    {
        get
        {
            return this.Data.MaxPerStack;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个名为Equip派生Item类的类,并且还有一个名为property的属性MaxPerStack,声明为new:

public class Equip : Item
{
    public new short MaxPerStack
    {
        get
        {
            return 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我调用了以下方法Add,它使用以下MaxPerStack属性item:

public void Add(Item item)
{
    Console.WriteLine("Stack: {0}.", item.MaxPerStack);
}
Run Code Online (Sandbox Code Playgroud)

当我做:

Add(new Equip());
Run Code Online (Sandbox Code Playgroud)

它属于一个人的MaxPerStack财产.ItemEquip

为什么会这样?

Ser*_*rvy 5

因为你没有标记Item.MaxPerStackvirtual,而你没有标记Equip.MaxPerStackoverride.你需要做这两件事来获得你期望的行为.

通过隐式标记基类型的方法sealednew在阻止虚拟分派时显式标记派生类型,这是用于确保在基类型上调用的方法将执行与实际运行时类型关联的实现的确切机制对象的,而不是将方法静态绑定到对象的编译时类型中的实现.