C#中抽象基类能否访问继承自它的子类的变量与方法?
问题解答:抽象父类能否访问子类自定义成员
核心结论
你给出的代码无法正常编译,抽象父类A默认不能直接访问子类B中独有的变量或方法。
原因说明
面向对象继承体系的成员访问是单向的:
- 子类继承父类后,可以直接访问父类中
public、protected、同程序集下internal级别的成员 - 父类的定义完全独立于子类,编译父类代码时,程序无法预知后续会有哪些子类继承、子类会新增什么自定义成员,所以不会识别子类独有的
test变量,你写的return test行会直接抛出「当前上下文中不存在名称“test”」的编译错误。
注:你给出的示例代码中B类的isActive方法定义返回值为void但存在返回值,本身也存在编译错误,后续改造示例已修正为bool返回值类型。
推荐实现方案(符合面向对象设计规范)
如果你要实现预期逻辑(调用B.isActive()返回true),可以通过在父类定义抽象属性的方式改造:
abstract class A { public bool activeA = false; // 父类定义抽象属性,要求所有继承的子类必须实现该属性 public abstract bool test { get; } public bool getState() { // 访问父类自身定义的抽象属性,实际取值由子类的实现决定 return test; } } class B : A { // 重写父类的抽象属性,赋值为true public override bool test => true; public bool isActive() { return base.getState(); } }
改造后调用new B().isActive()就会返回你预期的true。
不推荐的实现方案
如果你确实需要父类访问某个子类的独有成员,可以在父类方法中做类型判断后强转:
public bool getState() { if (this is B bInstance) { return bInstance.test; } return false; }
这种方式会让父类和子类强耦合,后续新增其他继承自A的子类时很容易出现逻辑漏洞,不建议使用。
内容的提问来源于stack exchange,提问作者Erijl
相关产品推荐
相关产品推荐

