为什么是can';在C#中不使用重写方法?(不是关于关键字)
输出为“我是一个。” 为什么会这样?这合理吗为什么是can';在C#中不使用重写方法?(不是关于关键字),c#,inheritance,overriding,C#,Inheritance,Overriding,输出为“我是一个。” 为什么会这样?这合理吗 由Visual Studio 2012编译 您需要在基类virtual中创建CallMe()方法,然后使用B中的覆盖修饰符: public abstract class A { public void CallMe() { Console.WriteLine("I am A."); } } public class B : A { new public void CallMe() { Console.WriteLine("I am
由Visual Studio 2012编译 您需要在基类
virtual
中创建CallMe()
方法,然后使用B
中的覆盖
修饰符:
public abstract class A
{
public void CallMe() { Console.WriteLine("I am A."); }
}
public class B : A
{
new public void CallMe() { Console.WriteLine("I am B."); }
}
class Program
{
static void Main(string[] args)
{
A a = new B();
a.CallMe();
}
}
B.CallMe()
不会覆盖A.CallMe()
,它会隐藏或隐藏A.CallMe()
。由于CallMe
是非虚拟方法,编译器根据a
变量的编译时类型选择要调用的方法。由于a
的编译时类型是class a
,它将调用a.CallMe()
如果您想让它调用B.CallMe()
,您需要在A.CallMe()
上使用virtual
关键字,这将启用虚拟调度,应用程序将根据A
的运行时类型调用CallMe()
方法,即class B
请参见您实际上没有覆盖,隐藏了
new
关键字。使用override
@user3576363它不会更改结果,因为您将其称为typeA
。如果你做了bb=newb();b、 CallMe()相反,您将看到B
消息。至于“为什么”它是这样工作的,这是因为它的设计就是这样工作的。而virtual
在base中,“new”的意思是“我希望这是一个与旧方法同名的新方法,而不是重写旧方法”。如果你不是这个意思,就别那么说。你正在调用旧方法。编译器已经告诉你你做错了。您添加了“new”以关闭编译器,但这并不能阻止您出错。下次,先用谷歌搜索错误消息。它会隐藏或隐藏B.CallMe()
不是这样,而是另一种方式。@user它与Java没有任何区别。Java方法总是虚拟的,除非声明为final。
public abstract class A
{
public virtual void CallMe() { Console.WriteLine("I am A."); }
}
public class B : A
{
public override void CallMe() { Console.WriteLine("I am B."); }
}