c#实例化来自子类的对象

时间:2019-06-03 17:11:25

标签: c# inheritance polymorphism

下面我有一些简单的代码,其中包含一个父类和一个子类。

使用系统;

//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()'仍称其父版本。

2 个答案:

答案 0 :(得分:1)

首先,您不应该使用new关键字隐藏基类方法,而应该使用virtualoverride关键字通过派生类方法覆盖它。它还将解决从基类而不是从派生类调用方法的问题。

有关其工作原理的详细信息,您应该阅读有关inheritance in C#的信息。

使用new关键字隐藏方法时,它始终使用声明类型中方法的实现,在您的情况下为Parent。但是,如果您使用virtualoverride,则使用的是初始化类型的方法的实现,在您的情况下为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");
    }
}

我将阅读注释中链接的所有文档,以决定哪种产品最适合您的用例。