首页 > 解决方案 > 了解列表中的继承项和基础项

问题描述

这是一个可能很愚蠢的问题,但我似乎无法解决这个问题,所以我来这里是为了一些想法。这是关于继承和列表的。

好的,所以我有两个类:TestClass 和 DerivedTestClass。DerivedTestClass 派生自 TestClass。这两个类都有一个名为“Method1”的方法。

这都是非常简单的方法。他们只是有一个消息框,说明正在访问什么方法。实际上,让我编写代码只是为了消除歧义:

public void Method1(String typeName)
{
    MessageBox.Show("Base method 1 + Type: "+typeName);
}

这是针对基类(TestClass)的。

public void Method1(String typeName)
{
    MessageBox.Show("Derived method 1 + Type: "+typeName);
}

这适用于派生类 (DerivedTestClass)。

接下来,我创建了这两个实例并为每个实例调用 Method1。这正是您所期望的。当我为基类调用它时,我为第一个消息框,当我调用派生类时,我得到了第二个消息框。

到目前为止还没有谜团,但现在我们到了我的理解似乎缺乏的部分。

我创建了一个列表,在其中添加了我创建的两个实例:基类的实例和派生类的实例。然后我创建了一个 foreach 循环,它遍历列表中的每个项目并调用 Method1,如下所示:

foreach (var tc in listT)
{
    tc.Method1(tc.GetType().Name);
}

在这两种情况下,都会调用基本方法。现在在一个方面我明白了,因为列表本身就是基类的类型。问题是如果我查看类型。如果我问列表中的第一项是什么类型,它会说 TestClass。如果我问列表中的第二项它的类型是什么,它会说 DerivedBaseClass。

现在可以通过将列表中的每个项目转换为自己的类型来解决这个问题。但它可能需要一个长长的 if 语句列表,具体取决于您拥有多少派生类型。另外,我想这是问题的核心,我只是对不得不将某些东西投射到它已经存在的东西上感到困惑。如果该项目是 DerivedBaseClass(由 GetType() 证明),我必须将其转换为 DerivedBaseClass 似乎很奇怪。在这些情况下我可以依赖 GetType 吗?它是否应该带有一个星号,上面写着“声明的内存只够基类使用,虽然这是一个派生类,但它目前是基类的形式”?

所以你可以说我有点困惑并寻求澄清。

标签: c#listinheritance

解决方案


两件事情:

  1. 您没有覆盖Method1,而是将其隐藏在派生类中,因此您可以将这些方法视为完全不同的事物。
  2. 您的列表仅包含对基本类型的引用,因此只会调用它公开的方法。

要解决此问题,请将您的类型更改为类似这样,注意virtual基方法和override派生类中的 :

public class BaseType
{
    public virtual void Method1(String typeName)
         //^^^^^^^ This
    {
        MessageBox.Show("Base method 1 + Type: "+typeName);
    }
}

public class DerivedType : BaseType
{
    public override void Method1(String typeName)
         //^^^^^^^^ And this
    {
        MessageBox.Show("Derived method 1 + Type: "+typeName);
    }
}

推荐阅读