我今天在代码中遇到了一个错误,突显了一个事实,就是我显然不像我想象的那样理解多态。这是一些示例代码,说明了我的错误:
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能够覆盖它,我将不得不这样做。