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

如何让C#多类共用属性?优化Length/Width/Height类定义

泛型化改造方案

方案一:泛型标记类实现(兼顾代码复用与类型安全)

这种方式通过空标记类区分不同度量类型,同时用泛型类复用Value属性,避免类型混淆:

// 空标记类,用于区分不同的度量类型
public class HeightTag { }
public class WidthTag { }
public class LengthTag { }

// 通用泛型度量类,统一实现Value属性
public class Measurement<T>
{
    public int Value { get; set; }
}

// 原模型改造
public class Data
{
    public Area Area { get; set; }
    public Dimensions Dimensions { get; set; }
}

public class Dimensions
{
    // 使用泛型类替代原有的Length、Width、Height类
    public Measurement<LengthTag> Length { get; set; }
    public Measurement<WidthTag> Width { get; set; }
    public Measurement<HeightTag> Height { get; set; }
}

优势

  • 仅需编写一次Value属性,彻底消除重复代码
  • 标记类保证Measurement<LengthTag>、Measurement<WidthTag>是不同类型,避免赋值时的类型混淆(比如不能把Height的值直接赋给Width)

方案二:抽象基类实现(简单复用,牺牲部分类型安全)

如果不需要严格的类型区分,也可以用抽象基类继承的方式:

// 抽象基类,定义通用的Value属性
public abstract class Measurement
{
    public int Value { get; set; }
}

// 子类仅需声明类,无需重复实现Value
public class Height : Measurement { }
public class Width : Measurement { }
public class Length : Measurement { }

// 原模型保持不变
public class Data
{
    public Area Area { get; set; }
    public Dimensions Dimensions { get; set; }
}

public class Dimensions
{
    public Length Length { get; set; }
    public Width Width { get; set; }
    public Height Height { get; set; }
}

优势

  • 改造成本极低,子类代码极简
  • 原Dimensions类无需修改

不足

  • Height、Width、Length本质上都是Measurement类型,无法在编译期阻止相互赋值,存在类型混淆风险

内容的提问来源于stack exchange,提问作者Nisha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:15:16