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

C#中如何将子类属性传递给抽象类

解决方案:让抽象类B访问子类A的属性

要实现子类A定义属性、抽象类B可以使用的效果,核心是在抽象类B中定义抽象/虚成员,让子类A去实现或重写,这样B就能通过这些成员访问A的属性值。以下是两种可行的实现方式:

方式一:抽象属性(强制子类实现)

修改抽象类B,定义抽象属性,要求所有子类必须实现该属性:

public abstract class B
{
    // 抽象属性,子类必须实现
    public abstract string Action { get; }

    protected B()
    {
        // 构造函数中使用子类实现的属性
        string a = Action;
    }

    public virtual void Test(string _action)
    {
        // 方法中使用子类的属性值
        _action = Action;
    }
}

子类A实现这个抽象属性:

public class A : B
{
    // 实现抽象属性,返回A自定义的值
    public override string Action => "A专属的Action值";

    // 也可以用带字段的形式,支持修改
    // private string _action = "A专属的Action值";
    // public override string Action 
    // { 
    //     get => _action; 
    //     set => _action = value; 
    // }
}

方式二:虚属性(子类可选重写)

如果不需要强制所有子类都实现,可在B中定义带默认值的虚属性,子类A按需重写:

public abstract class B
{
    // 虚属性,提供默认值
    public virtual string Action => string.Empty;

    protected B()
    {
        string a = Action;
    }

    public virtual void Test(string _action)
    {
        _action = Action;
    }
}

子类A重写虚属性:

public class A : B
{
    // 重写虚属性,替换为A自定义的值
    public override string Action => "A自定义的Action";
}

注意事项

  • 在抽象类构造函数中访问子类属性时,确保子类的属性初始化逻辑已经完成(比如使用表达式体属性或在子类构造函数中先初始化字段),避免出现未初始化的问题。
  • 若属性需要被修改,可使用带get/set的属性形式,而非只读的表达式体。

内容的提问来源于stack exchange,提问作者Rade Vignjevic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:02:56