下面我有一些简单的代码,其中包含一个父类和一个子类。
使用系统;
//Base Class
public class Parent {
public void foo() {
Console.WriteLine("Parent");
}
}
//Child Class
public class Child : Parent
{
new public void foo() {
Console.WriteLine("child");
}
}
Parent parent = new Child();
parent.foo();
我对以上两行的工作方式感到困惑。我希望编译器在尝试将Parent实例化为自己的子类时会吠叫。另外,为什么'parent.foo()'仍称其父版本。
答案 0 :(得分:1)
首先,您不应该使用new
关键字隐藏基类方法,而应该使用virtual
和override
关键字通过派生类方法覆盖它。它还将解决从基类而不是从派生类调用方法的问题。
有关其工作原理的详细信息,您应该阅读有关inheritance in C#的信息。
使用new
关键字隐藏方法时,它始终使用声明类型中方法的实现,在您的情况下为Parent
。但是,如果您使用virtual
和override
,则使用的是初始化类型的方法的实现,在您的情况下为Child
。
using System;
public class Parent
{
public virtual void foo()
{
Console.WriteLine("Parent");
}
}
public class Child : Parent
{
public override void foo()
{
Console.WriteLine("Child");
}
}
答案 1 :(得分:0)
那为什么'parent.foo()'仍会调用其父版本?
因为您正在使用foo
遮盖new
。
虚拟或抽象方法可以被子类覆盖:
//Base Class
public class Parent
{
public virtual void foo()
{
Console.WriteLine("Parent");
}
}
//Child Class
public class Child : Parent
{
public override void foo()
{
Console.WriteLine("child");
}
}
我将阅读注释中链接的所有文档,以决定哪种产品最适合您的用例。