Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是can';在C#中不使用重写方法?(不是关于关键字)_C#_Inheritance_Overriding - Fatal编程技术网

为什么是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它不会更改结果,因为您将其称为type
A
。如果你做了
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."); }
}