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如果这是在一次工作面试中问到的,那么要么你没有完全理解问题,要么你不想在那里工作,因为他们的面试官甚至对编程都没有基本的了解。