多态性误解;意外键入“虚拟”而不是“替代”,结果出乎意料

时间:2019-03-04 18:44:47

标签: c# polymorphism override virtual

我今天在代码中遇到了一个错误,突显了一个事实,就是我显然不像我想象的那样理解多态。这是一些示例代码,说明了我的错误:

internal class Startup{
    interface IInterface{
        bool SomeProp{get;}
    }
    class ClassA:IInterface{
        public virtual bool SomeProp{get{return true;}}
    }
    class ClassB:ClassA{
        public override bool SomeProp{get{return false;}}
    }
    public static void Main(String[] args){
        IInterface test=new ClassB();
        bool prop=test.SomeProp;
        Console.WriteLine("result="+prop);
    }
}

这完全是我期望的结果,显示为false。但是请考虑以下代码:

internal class Startup{
    interface IInterface{
        bool SomeProp{get;}
    }
    class ClassA:IInterface{
        public virtual bool SomeProp{get{return true;}}
    }
    class ClassB:ClassA{
        public virtual bool SomeProp{get{return false;}}
    }
    public static void Main(String[] args){
        IInterface test=new ClassB();
        bool prop=test.SomeProp;
        Console.WriteLine("result="+prop);
    }
}

在这段代码中,我无意中在ClassB中键入了单词“ virtual”而不是“ override”。这是一架打字机,但我仍然希望发生以下事情之一:

(1)编译器错误,告诉我,如果我真的想在ClassB级别创建一个名为SomeProp的新虚拟属性,则应该使用'new'关键字。

(2)完整的功能传递:将通过ClassB返回false。

...我不希望发生的一件事就是返回true。有人可以解释第二个例子中typeo发生了什么吗?我应该在A类中使用虚拟关键字 吗?如果我希望其后代ClassB能够覆盖它,我将不得不这样做。

0 个答案:

没有答案