首页 > 解决方案 > 动态多态性/实例创建混乱

问题描述

我在理解 C# 中的动态多态性时遇到了问题,这导致我遇到了另一个问题,即创建实例。

我知道的 :

  1. 动态多态性是方法覆盖。
  2. 继承必须发生(换句话说,我们必须有一个基类和派生类)

我有以下代码:

// Base Class

public class BClass

{

    public virtual void GetInfo()

    {

        Console.WriteLine("Learn C# Tutorial");

    }

}

// Derived Class

public class DClass : BClass

{

    public override void GetInfo()

    {

        Console.WriteLine("Welcome to the tutorial");

    }

}

class Program

{

    static void Main(string[] args)

    {

        DClass d = new DClass();

        d.GetInfo();

        BClass b = new BClass();

        b.GetInfo();

        Console.WriteLine("\nPress Enter Key to Exit..");

        Console.ReadLine();

    }

}

我有两个类: BClass(父类)/DClass(派生自 BClass 的子类) 这里发生的是方法 GetInfo()(在 BClass 中)在 DClass 中被覆盖。为了使覆盖工作,我们必须添加两个关键字:virtual(在基类中),overridden(在派生类中)。如果我删除这两个关键字会怎样,所以 public void GetInfo()[base class]/public void GetInfo()[derived class]。我的输出将是相同的。我还会有

好像在删除关键字之前从未发生过覆盖的概念。

现在我尝试在网上搜索,发现要使覆盖生效,在 Main() 中创建的实例必须不同。

但是为什么有人会使用 BClass d = new DClass() 而不是 DClass d = new DClass(),而我们只想创建一个 DClass 的实例。

所以总结一下:

标签: c#polymorphism

解决方案


如果您尝试DClass通过BClass变量/引用调用,输出将会改变:

public class BClass
{
    public virtual void GetInfo() => Console.WriteLine("In BClass");
}    
// Derived Class
public class DClass : BClass
{
    public override void GetInfo() => Console.WriteLine("In DClass");
}

BClass d = new DClass();
d.GetInfo();
BClass b = new BClass();
b.GetInfo();

印刷:

In DClass
In BClass

接下来:

public class BClass
{
    public void GetInfo() => Console.WriteLine("In BClass");
}    
// Derived Class    
public class DClass : BClass
{
    public void GetInfo() => Console.WriteLine("In DClass");
}

BClass d = new DClass();
d.GetInfo();
BClass b = new BClass();
b.GetInfo();

打印(并且还给你编译器警告 CS0108,它表示方法隐藏):

In BClass
In BClass

为什么 - 你可以有一个集合,BClassList<BClass>可以在其中放置两个类的实例。您可以使用相同的方法来处理两者BClassDClass接受父类的参数,基本上这两个类具有相同的合同并且可能共享部分实现。有关更多信息,请参阅问题。


推荐阅读