You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 03:00:05