了解列表中的继承项和基础项

时间:2018-11-08 14:07:30

标签: c# list inheritance

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

好的,所以我有两个类: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吗?它是否应该带有一个星号,上面写着“声明的内存仅对基类足够,而虽然这是派生类,但当前为基类形式”?

所以您可以说我有点困惑,需要澄清。

1 个答案:

答案 0 :(得分:3)

两件事:

  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);
    }
}