C# 如何从基类访问子类属性

C# 如何从基类访问子类属性,c#,inheritance,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();

我的课程结构如下:

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类:A
{
可数b;
}
丙类:乙类
{
可数c;
}
D类:C类
{
i可数d;
}
E类
{
静态void Main()
{
A=新的A();
}
}
现在我想从创建的对象a访问所有字段a、b、c、d。 有可能这样做吗?如何做到


此外,还可能存在此继承树可能增长的场景。因此,我应该如何处理这个问题,也就是说,a能够访问新类的字段,而不会在将来进行任何代码更改。

您不能访问字段
b
c
d
,因为它们不存在于
a
的实例中

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

编辑:关于您的意思的一些可能想法:

  • 您可能想创建
    A A=new D()
    ,然后从
    main()
    访问子类型
    D
    的属性。这在强制转换中是可能的,但如果您首先将变量声明为
    D
    ,则更容易

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

  • 您可能希望新的
    A()
    具有所有属性
    A
    b
    c
    d
    。在这种情况下,您的基本理解是错误的:继承的工作方式正好相反。类
    D
    具有所有四个属性,而不是类
    A

  • 进一步编辑:


    重新阅读代码时,还存在另一个问题:所有字段都隐式地
    private
    (因为这是默认值)。因此,继承链中的其他类将无法访问任何字段。您需要将它们标记为受保护的或公共的,以使它们可见。

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

    `A=新的A()//a、 a有空

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

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

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

    你想做什么?我想你是在反省。这是不可能的,因为A没有那些字段why
    A A=newa()而非
    D=新的D()
    ?@Jon:it'#甚至不可能与反射一起使用:OP已经创建了
    A
    的实例。该实例上没有字段
    b
    c
    d
    ,反射或否!值得注意的是,您可以在第二种情况下使用
    ((B)B).B
    访问该属性。感谢您的回复。这是在一次面试中问到的。我只是想知道这是否可行。@Saurabh如果这是在一次工作面试中问到的,那么要么你没有完全理解问题,要么你不想在那里工作,因为他们的面试官甚至对编程都没有基本的了解。