我有以下类的结构:
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能够访问新类的字段而不需要在将来进行任何代码更改。
答案 0 :(得分:5)
您无法访问字段b
,c
或d
,因为A
的实例上不存在这些字段。
如果您想创建一个包含所有这些字段的类,您有一个:D
。请改为创建D
的实例。
编辑:关于您可能意味着什么的一些可能的想法:
您可能意味着要创建A a = new D()
,然后从D
访问子类型main()
的属性。这可以通过强制转换实现,但如果您首先将变量声明为D
,则会更容易。
您可能意味着您希望类A
的代码能够引用类D
中的属性。这可以通过反射或铸造直接实现,但不建议这样做,因为设计非常脆弱且难以阅读。更好的解决方案是用户覆盖,其中类A
中的方法(不使用D
中的属性)可以在类D
中重写为具有更多特定功能。
您可能希望自己的new A()
拥有所有属性a
,b
,c
和d
。在这种情况下,您的基本理解是错误的:继承是相反的。类D
包含所有四个属性,而不是类A
。
进一步编辑:
重新阅读您的代码,您还有一个问题:您的所有字段都是隐式private
(因为这是默认值)。因此,继承链中的其他类都不能访问您的任何字段。您需要将它们标记为protected
或public
,而不是让它们可见。
答案 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)
如果您的基类知道子类中的变量并想要访问它们,那么它们应该在基类本身中定义(然后由子类继承)。