我想知道如果我不把override
关键字放在派生类方法m1()
的方法之前,那么这之前的默认值是什么,还是会抛出编译时错误?c#覆盖关键字
class A { virtual void m1(){} }
class B: A { void m1(){} }
我想知道如果我不把override
关键字放在派生类方法m1()
的方法之前,那么这之前的默认值是什么,还是会抛出编译时错误?c#覆盖关键字
class A { virtual void m1(){} }
class B: A { void m1(){} }
首先,你会因为virtual
成员不能是私有的,其A.m1
是书面得到一个编译时错误。
其次,一旦你解决这个问题,你会得到一个编译时警告,B.m1
隐藏继承的成员A.m1
。
第三,如果你做这样的事情:
A a = new B();
a.m1();
这将调用A.m1
而如果你插入override
进入B.m1
定义,然后上面会调用B.m1
。但是,如果将new
插入到B.m1
的定义中,那么上述操作仍将调用A.m1
,但它将省略编译时警告。
它会隐藏意味着基类方法将不会继承到派生类。如果我使用新的kew,那么获得它将隐藏基类方法。如果是的话,那么使用关键字KEY和不使用关键字KEY的区别是什么KEY – NoviceToDotNet 2010-10-28 17:59:33
“KEY”的意思是'new'吗?不同的是它会摆脱编译时警告。警告在那里告诉你,“嘿,你是否想要重写或隐藏继承的成员?我会假设你想隐藏,但你应该看看这个。” “新”是告诉编译器,“是的,我的意思是隐藏继承的成员。”所以是的,这种行为是一样的,但警告是真正的目的。 C#小心翼翼地阻止你在脚下射击自己。 – jason 2010-10-28 18:01:14
如果你想隐藏它,然后使用“新”来表明你真的想隐藏并且不覆盖它。新做的唯一事情是压制编译器警告。 – CodesInChaos 2010-10-28 18:02:19
当你编译它会给你一个警告,说B.m1()
隐藏继承成员A.m1()
。
如果您希望打破继承链或使用覆盖来获得您的虚拟行为,您应该使用new关键字。
没有override
编译器发出警告,据我记忆。在这种情况下,该方法被视为具有修饰符new
。
当您编译此代码时,Visual Studio输出了什么? – 2010-10-28 17:57:23