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



这是一个可能很愚蠢的问题,但我似乎无法推理,所以我来这里是为了思考。它是关于继承和列表的。

好的,我有两个类: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。这正是你所期望的。当我为基类调用它时,我为第一个消息框调用它,当我调用派生类时,我得到了第二个消息框。

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

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

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

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

现在可以通过将列表中的每个项强制转换为其自己的类型来解决此问题。但是,它可能需要根据派生类型的数量列出一长串if语句。此外,我想这就是问题的核心,我只是对必须将某个东西强制转换为它已经存在的东西感到困惑。如果该项是DerivedBaseClass(如GetType((所证明的(,那么我必须将其强制转换为DerivedBase Class似乎很奇怪。在这种情况下,我可以依靠GetType吗?它是否应该带有一个星号,上面写着"声明的内存只够基类使用,虽然这是一个派生类,但它目前是基类的形式"?

所以你可以说我有点困惑,想澄清一下。

两件事:

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

最新更新