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.
相关产品推荐
相关产品推荐

