【发布时间】:2019-06-03 17:11:25
【问题描述】:
下面我有一些简单的代码,其中包含一个父类和一个从它扩展的子类。
使用系统;
//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()'仍然会调用它的父版本。
【问题讨论】:
-
为什么您认为您无法实例化
Parent对象?毕竟,Parent类只是一个沼泽标准、普通、普通、普通的类。从Parent继承的另一个类不会使Parent不可实例化(此外,编译器通常不会崩溃。如果编译器对您的源代码有问题,编译器会发出错误消息,但不会崩溃...) -
您将方法覆盖与阴影混合在一起。而且,您还应该阅读有关 OOP 的基本教程。我建议您阅读 Microsoft Docs 上的官方文档。喜欢这个:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
嗯,
Child实例本质上也是Parent实例(因为Child类继承自Parent),因此为什么Child实例可以被视为它是一个Parent实例(包括将Child实例分配给Parent类型的变量/具有Parent类型的引用/变量引用Child实例)。关于方法调用:您没有覆盖子方法,而是在做所谓的“成员/方法隐藏”(也称为“成员隐藏”,请参阅我之前的 Camilo 评论) -
由于
Child扩展了Parent,您可以说Child是Parent。当一个类继承/扩展另一个类时,可以将其声明为它继承/扩展的类。因为它被声明为Parent,所以您将只能使用Parent上的方法,即使运行时将该类实例化为Child类。 -
关于成员隐藏/隐藏,您可能想在这里阅读:stackoverflow.com/questions/3838553/overriding-vs-method-hiding(另外,一般不要使用成员隐藏。在没有真正了解它的作用的情况下随意使用成员隐藏会导致程序中的错误和意外行为)
标签: c# inheritance polymorphism