-2

我有以下类结构:

class A
{
    IEnumerable<int> a;
}

class B:A
{
    IEnumerable<int> b;
}

class C:B
{
    IEnumerable<int> c;
}

class D:C
{
    IEnumerable<int> d;
}

class E
{
    static void Main()
    {
        A a = new A();
    }
}

现在我想从创建的对象 a 中访问所有字段 a、b、c、d。是否可以这样做以及如何做?

也可能存在这种继承树可能会增长的情况。那么我应该如何处理这个问题,即 a 能够访问新类的字段而无需在未来进行任何代码更改。

4

4 回答 4

5

您无法访问字段b, c, 或d因为它们不存在于 的实例上A

如果你想创建一个包含所有这些字段的类,你有一个:D. D而是创建一个实例。

编辑:关于你可能是什么意思的一些可能的想法:

  1. 您可能的意思是要创建A a = new D()然后D从您的main(). 这可以通过强制转换实现,但如果您D首先将变量声明为 a 会更容易。

  2. 您可能意味着您希望您的类的代码A能够引用类中的属性D。这可以通过反射或投射直接实现,但不建议这样做,因为设计非常脆弱且难以阅读。更好的解决方案是用户覆盖,其中类中的方法A(不使用 中的属性D)可以在类中被覆盖D以具有更具体的功能。

  3. 您可能的意思是您希望您new A()拥有所有属性ab和。在这种情况下,您的基本理解是错误的:继承是相反的。Class具有所有四个属性,而不是 class 。cdDA

进一步编辑:

重新阅读您的代码,您还有一个问题:您的所有字段都是隐式的private(因为这是默认设置)。因此,继承链中的其他类将无法访问您的任何字段。您需要将它们标记为protectedpublic改为可见。

于 2013-06-04T13:39:37.417 回答
1

A 的实例只有属性 a。您可以定义 A 类型的变量并将其分配给 B 类型的实例,但您将无法从中访问属性 b。

`A a = 新的 A(); //aa可用

A b = 新 B(); //只有 .a 可用,但由于继承,赋值有效`

于 2013-06-04T13:42:16.203 回答
1
D d = new D();

现在您可以访问 a、b、c、d;对象 a 不包含 IEnumerable b 或 c 或 d 的定义,只有类型 D 的对象包含所有 IEnumerables 实例的定义

于 2013-06-04T13:45:14.467 回答
1

如果您的基类知道子类中的变量并想要访问它们,则应在基类本身中定义它们(然后由子类继承)。

于 2013-06-04T13:59:36.603 回答