C#派生类如何将基类继承的属性按指定接口类型对外暴露
问题核心原因
你当前使用new关键字的实现本质是在子类中定义了同名但完全独立的新属性,父子类的ValueSet有各自的存储位置,没有数据关联;加上父类ValueSet是public修饰,对外始终可见,才会出现访问时默认调用父类属性的问题。
解决方案
方案1:访问修饰符调整+属性代理(适合少量子类场景)
把父类的ValueSet改为protected修饰,仅允许子类内部访问,子类的同名属性直接代理父类的属性,保证数据完全同步,不会出现两份独立存储:
public abstract class Parent { // 改为protected,对外不可见,仅子类内部可访问 protected BulkValueSet ValueSet {get;set;} // 其他属性和方法 } public class ChildA : Parent { // 子类属性直接代理父类属性,无独立存储 new public ISpecificValueSetA ValueSet { get => base.ValueSet; set => base.ValueSet = value as BulkValueSet; } // 其他逻辑 } public class ChildB : Parent { new public ISpecificValueSetB ValueSet { get => base.ValueSet; set => base.ValueSet = value as BulkValueSet; } // 其他逻辑 }
调整后外部访问子类实例时,只能看到子类公开的接口类型ValueSet,不会出现父类属性的提示。
方案2:泛型基类重构(适合多子类场景,推荐)
你提到需要为多个子类实现该逻辑,用泛型基类可以避免每个子类重复写代理代码,复用性更高:
// 泛型基类,T为子类需要对外暴露的接口类型 public abstract class Parent<T> where T : class { // 内部统一存储BulkValueSet实例 protected BulkValueSet _valueSet; // 对外暴露指定接口类型的属性 public T ValueSet { get => _valueSet as T; set { if (value is not BulkValueSet bulkValue) throw new ArgumentException($"参数必须为BulkValueSet类型实例", nameof(value)); _valueSet = bulkValue; } } // 其他公共属性和方法 } // 子类仅需指定对应的接口泛型参数即可,无需重复实现ValueSet public class ChildA : Parent<ISpecificValueSetA> { // 其他逻辑 } public class ChildB : Parent<ISpecificValueSetB> { // 其他逻辑 }
内容的提问来源于stack exchange,提问作者Andorrax
相关产品推荐
相关产品推荐

