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

C# 派生类属性指向基类:调用A/B属性触发基类逻辑的实现方案

实现方案

你当前写法的问题是:派生类中声明的A/B是独立的自动属性,和基类的同名成员没有关联,调用时只会访问派生类自身的属性存储,不会触发基类逻辑。以下是两种适配你需求的实现方式:

方案一:基类封装保护级实现,派生类按需公开(推荐)

该方案完全匹配你「不同派生类按需暴露A/B属性」的要求,不会出现派生类意外继承到不需要的属性的问题:

第一步:调整基类实现,把核心逻辑封装为保护级成员

class Base
{
    // 仅派生类可访问核心逻辑,不对外暴露
    protected int GetAValue() => 10;
    protected int GetBValue() => 15;
    
    // 如果需要支持set操作,可对应添加保护级Set方法
    // protected void SetAValue(int value) { /* 你的逻辑 */ }
}

第二步:派生类按需声明公开属性,指向基类实现

// 只暴露A属性的派生类
class D1 : Base
{
    public int A 
    { 
        get => GetAValue();
        // set => SetAValue(value); 不需要set可直接删除该访问器
    }
}

// 同时暴露A、B属性的派生类
class D2 : Base
{
    public int A { get => GetAValue(); }
    public int B { get => GetBValue(); }
}

运行效果

和你给出的示例完全一致:

static void Main(string[] args)
{
    D1 d1 = new D1();
    D2 d2 = new D2();

    Console.WriteLine(d1.A); // 输出10
    Console.WriteLine(d2.A); // 输出10
    Console.WriteLine(d2.B); // 输出15
}

方案二:批量改造优化

如果你有100个派生类需要修改,可通过以下方式减少重复工作量:

  • 用T4模板根据配置批量生成派生类的属性定义代码
  • 用C#源生成器,给标记了对应特性(比如[ExposeA]/[ExposeB])的派生类自动生成对应的属性代码,完全不需要手动修改派生类

注意事项

  • 不要直接把基类的A/B声明为公开成员,否则所有派生类都会默认继承这两个属性,不符合你按需暴露的需求
  • 派生类属性的访问修饰符要和对外暴露的要求匹配,默认不加修饰符的属性是私有级别,外部无法访问

内容的提问来源于stack exchange,提问作者Srdjan M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:18:04