首页 > 解决方案 > 继承对象列表

问题描述

我有一个非常基本的问题:继承。我是新来的。

我有一个基类:

public class base1
{
    public int common {get; set;}
}

我有一堆派生类,其中两个是

public class derived1 : base1
{
    public int prop1 {get; set;}
}

public class derived2 : base1
{
    public int prop2 {get; set;}
}

我想像这样在第三类中使用它们,但出现错误:

public class usageclass
{
    public List<base1> Data;

    public usageclass()
    {
        Data = new List<base1>();
        derived1 d1 = new derived1();
        d1.common = 0;
        d1.prop1 = 1;
        Data.Add(d1);

        derived2 d2 = new derived2();

        d2.common = Data[0].common + 10;
        d2.prop2 = Data[0].prop1 + 10;  //<--- this line doesn work.  see below.
        Data.Add(d2);
    }
}

在指向的监视窗口或对象资源管理器中Data[0],我可以看到prop1,但是如果我键入Data[0].prop1,它会告诉我prop1不存在。我猜这是因为我有Data一个列表base1,而不是派生类,但是我该如何实现呢?我的最终目标是usageclass拥有一个List属于不同对象类型的属性,我的想法是让它们派生自同一个基类可以实现这一点。为什么我可以在对象资源管理器中看到所有内容,但在输入时却看不到。

谢谢!

标签: c#inheritance

解决方案


这是交易,让我们用具体的东西来玩这个。

  1. 你有一份动物清单。

  2. 你加了一只青蛙和一只猫

  3. 然后你尝试设置第一只动物的爪属性。

怎么会有人知道它是猫?很有可能不会。

您将需要测试派生类型,并相应地进行转换

投掷

var cat = (Cat)someRandomAnimal; // if it's not a cat you will get a run-time error

作为运营商

var cat = someRandomAnimal as cat; 
if (cat != null)
   cat.Claws - 4;

是运算符

if(someRandomAnimal is Cat)
   ((Cat)someRandomAnimal).Claws = 3;

与 is operator C# 7.0+匹配的模式

expr 是类型 varname

if(someRandomAnimal is Cat cat)
   cat.Claws = 4;

推荐阅读