【问题标题】:List of inherited objects继承对象列表
【发布时间】:2019-08-27 22:24:27
【问题描述】:

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

我有一个基类:

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 的不同对象的属性,我的想法是让它们派生自同一个基类可以实现这一点。为什么我可以在对象资源管理器中看到所有内容,但在输入时却看不到。

谢谢!

【问题讨论】:

  • 我认为您需要做的是在访问列表元素时,您必须使用 .GetType() 之类的东西检查类型,然后将您的对象转换为正确的派生类型,您应该有你的属性
  • DataList&lt;base1&gt;,而base1 没有.prop1 属性。

标签: c# inheritance


【解决方案1】:

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

  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 运算符匹配的模式 C# 7.0+

expr 是类型 varname

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多