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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:57:18