如何在A1类中优雅访问B1类属性?现有方案存缺陷求优化
问题场景
现有4个类:A、B、A1和B1。其中A1是A的子类,B1是B的子类;A类包含一个类型为B的属性foo。需要在A1类中合理访问B1类的属性,目前有两种可行方案但都存在明显问题:
- 方案1:在A1中新增
B1类型的属性b1_foo,但会导致同一对象被存储在两个属性中,存在数据冗余和不一致风险 - 方案2:每次访问时将
this.foo强转为B1类型,但每次访问都要做类型转换,代码冗余且不够优雅
有没有更优的实现方式?
原问题代码示例:
public class A { public A(B foo) { this.foo = foo; } public B foo { get; set; } } public class B {} public class A1 : A { // 方案1:新增B1类型属性 public B1 b1_foo { get; set; } public A1(B1 foo) : base(foo) { this.b1_foo = foo; } public void SomeMethod() { // 方案1的访问方式 var val = b1_foo.SomeProperty; // 方案2的访问方式:强制类型转换 val = ((B1)this.foo).SomeProperty; } } public class B1 : B { public int SomeProperty {get;set;} }
最优解决方案:泛型重构基类
通过将基类A改造为泛型类,让A1在继承时指定对应的B1类型,既避免对象重复存储,也无需每次强转。
重构后的代码示例:
// 泛型基类A,约束泛型参数必须继承自B public class A<T> where T : B { public A(T foo) { this.Foo = foo; } public T Foo { get; set; } } public class B {} // A1继承泛型基类A,并指定泛型参数为B1 public class A1 : A<B1> { public A1(B1 foo) : base(foo) { } public void SomeMethod() { // 直接访问B1的属性,无需强转,也没有冗余属性 var val = this.Foo.SomeProperty; } } public class B1 : B { public int SomeProperty {get;set;} }
方案优势
- 无冗余存储:仅通过基类的泛型属性
Foo存储对象,避免同一对象被多次持有 - 类型安全且简洁:编译时就确定
Foo的类型为B1,运行时无需强转,代码更简洁 - 扩展性强:后续新增A2、B2这类继承组合时,直接复用泛型基类即可,无需重复改造
内容的提问来源于stack exchange,提问作者slowjaguar
相关产品推荐
相关产品推荐

