如何从基类访问子类属性

时间:2013-06-04 13:35:34

标签: c# inheritance

我有以下类的结构:

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 个答案:

答案 0 :(得分:5)

您无法访问字段bcd,因为A的实例上不存在这些字段。

如果您想创建一个包含所有这些字段的类,您有一个:D。请改为创建D的实例。

编辑:关于您可能意味着什么的一些可能的想法:

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

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

  3. 您可能希望自己的new A()拥有所有属性abcd。在这种情况下,您的基本理解是错误的:继承是相反的。类D包含所有四个属性,而不是类A

  4. 进一步编辑:

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

答案 1 :(得分:1)

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

`A a = new A(); //a.a可用

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

,分配有效

答案 2 :(得分:1)

D d = new D();

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

答案 3 :(得分:1)

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