如何让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
相关产品推荐
相关产品推荐

