【问题标题】:Issue with multilevel inheritance [duplicate]多级继承问题[重复]
【发布时间】:2021-03-18 12:27:16
【问题描述】:

我有 3 个类的多级继承

class Product1
{
    public virtual void Show()
    {
        Console.WriteLine("Product1.show");
    }
}
class Product2 : Product1
{
    public override void Show()
    {
        Console.WriteLine("Product2.show");
    }
}
class Product3 : Product2
{
    public new void Show()
    {
        Console.WriteLine("Product3.show");
    }
}

在创建对象时,我将 Product3 的对象分配给 Product1。

class Products
    {
        static void Main()
        {
            Product1 product1 = new Product1();
            Product3 product3 = new Product3();

            product1 = product3;

            product3.Show();
            product1.Show();
        }
    }

并调用 Show 方法。我认为在这两种情况下,答案都是 Product3.show 但不确定如何调用 Product2.show。

Console screenshot

任何关于解释的帮助将不胜感激:)

【问题讨论】:

  • 请注意,不是截图,而是“输出:”,然后输出会更清晰。
  • 如果您已经知道newoverride 之间的区别(因为您同时使用了两者),也许您会感到困惑,即使您分配了@987654327 的实例,也不会调用Prduct3.Show @。原因是您将其分配给 Product1 类型的变量,而不是 Product3
  • @TimSchmelter,我期待Product3 两次!因为我已经将Product3 的对象分配给Product1。但是正如您所澄清的那样,这是不可能的?!我还是一头雾水,为什么Product2.Show出现在图片里
  • @kardinal: 什么期望Product3 两次,什么是不可能的?对不起,但你的评论让我很困惑。当然有可能得到两次"Show Product3"。您只需将new 关键字替换为override。关键字new 创建了一个新方法,它与继承的方法Show(只是名称)无关。
  • @kardinal:因为您在Product2 中覆盖了Show,实际上这是一个继承自Product2Product3 实例。即使您“隐藏”父类型(类或接口)中的实例,继承也有效。

标签: c# oop inheritance virtual


【解决方案1】:

您的Product3.Show 方法实际上是一个完全不同的方法,就编译器而言,Product1.ShowProduct2.Show 覆盖。通过使用 new 修饰符,您已经明确地将其与现有的 Show 方法隔离开来。 C# 编译器(和 CLR)的工作方式完全符合我的预期。

基本上,如果您想要 Product3.Show 即使通过编译时类型为Product1Product2 的引用也被调用,您应该使用override 而不是new .

【讨论】:

  • 我还是一头雾水,为什么Product2.Show 会出现在画面中。 :(
  • @kardinal:因为您在Product3 中使用new 而不是override。时期。您将 Product3 分配给 Product1 变量,因此编译器会丢失此 Product1 具有 Show 的新实现的信息(在 Product3) 中定义并使用对 Product2 的正常继承。您将在调用 Show 之前必须将其转换为 Product3 才能看到 "Product3.show"
  • @TimSchmelter,您能否详细说明在这种情况下new 是如何工作的?它应该只适用于它使用的Product3。为什么它适用于 Product1 ?正因为如此 - product1 = product3
  • @TimSchmelter,我没有阅读您的编辑版本。现在说得通了。谢谢人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多