【问题标题】:Polymorphism in C#. Base Class's Method is Called But Why? [duplicate]C#中的多态性。基类的方法被调用但是为什么? [复制]
【发布时间】:2015-07-12 22:12:44
【问题描述】:

我读过的大多数关于继承层次结构中方法的多态性的文章没有提供发生这种情况的原因。有人可以提供以下行为的原因或类比吗?

Class A{
    public void Print(){
        Console.WriteLine("A.Print");
    }
}

Class B : A{
    public void Print(){
        Console.WriteLine("B.Print");
    }
}

Class Test{
   public static void Main(string[] args){
         A a = new B();
         a.Print();  // Prints "A.Print"
    }
}

Test 类中的代码打印“A.Print”,但为什么?

【问题讨论】:

标签: c# inheritance polymorphism overriding virtual


【解决方案1】:

在类测试中,你定义了一个类型 A 的实例 因此调用了类 A 定义中的 Print 方法。

这一切都与铸造有关,也许这很有用

https://msdn.microsoft.com/en-us/library/ms173105.aspx

【讨论】:

  • 通过隐式转换,我会得出结论或假设 - 当我将派生类的实例分配给其基类类型的对象时,派生类的实例(隐式)类型转换为基类的类型。我也能够保证这一点——当我将鼠标悬停在隐式类型转换对象的成员上时,它显示为基类的成员。
    谢谢奶酪,我将您的答案标记为答案,因为它几乎解释了我想如何理解这一点。
    谢谢大家!
【解决方案2】:

您创建了一个 B 的实例,可以说是“更大”,但变量“a”被转换为“更小”的类 A,并包含方法 print A。您做了类似的事情:

A : IClass B : IClass

接口暴露了A和B中的一些方法,你要触发它,使用:

(IClass)A.打印 (IClass)B.打印

这里也一样:

简单来说。 B 包含 A 类。所以你用 A a = new B();启动了 B 类,但同时提取(转换)为 A 类。

【讨论】:

  • 我相信这就是我想要的(尤其是结尾的段落)或者我进一步阅读后理解的......谢谢大家。
【解决方案3】:

将基类方法设为虚拟,并在派生类方法中使用 override 关键字。

【讨论】:

    猜你喜欢
    • 2015-01-16
    • 2017-01-10
    • 2018-07-11
    • 2011-02-20
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多