解决枚举无法继承问题:约束IDevice实现类的状态属性与方法
问题场景
现有Phone和Computer类均实现IDevice接口,前者使用PhoneStatus枚举作为状态属性,后者使用ComputerStatus枚举,且二者都具备根据对应状态返回数据的GetStuffByStatus方法。由于枚举不支持继承,希望通过IDevice接口强制实现类定义专属的状态属性及对应的GetStuffByStatus方法,最初设想的接口形式如下(但该形式无法适配不同的专属枚举):
interface IDevice { string Name { get; set; } string Manufacturer { get; set;} DeviceStatus Status { get; set;} IEnumerable<object> GetStuffByStatus(DeviceStatus status); }
解决方案
可以通过泛型接口完美实现需求,既统一了接口契约,又能让每个实现类使用自己专属的状态枚举:
1. 定义泛型接口
通过泛型约束限定状态类型为枚举,强制实现类必须传入自己的专属枚举类型:
interface IDevice<TStatus> where TStatus : Enum { string Name { get; set; } string Manufacturer { get; set; } // 专属状态属性 TStatus Status { get; set; } // 对应专属状态的方法 IEnumerable<object> GetStuffByStatus(TStatus status); }
2. Phone类实现泛型接口
enum PhoneStatus { On, Off } class Phone : IDevice<PhoneStatus> { public string Name { get; set; } public string Manufacturer { get; set; } public PhoneStatus Status { get; set; } public IEnumerable<object> GetStuffByStatus(PhoneStatus status) { // 这里编写Phone对应状态的业务逻辑 yield return "Phone data based on status"; } }
3. Computer类实现泛型接口
enum ComputerStatus { Started, ShutDown, Booting, ShuttingDown } class Computer : IDevice<ComputerStatus> { public string Name { get; set; } public string Manufacturer { get; set; } public ComputerStatus Status { get; set; } public IEnumerable<object> GetStuffByStatus(ComputerStatus status) { // 这里编写Computer对应状态的业务逻辑 yield return "Computer data based on status"; } }
4. 兼容统一设备集合的扩展方案
如果需要把不同设备放到同一个集合中统一处理(比如只访问Name、Manufacturer等基础属性),可以再定义一个非泛型的基础接口,让泛型接口继承它:
// 基础非泛型接口,用于统一标识所有设备 interface IDevice { string Name { get; set; } string Manufacturer { get; set; } // 通用状态获取,返回Enum基类 Enum Status { get; } } // 泛型接口继承基础接口,保留专属状态和方法 interface IDevice<TStatus> : IDevice where TStatus : Enum { // 用new关键字覆盖基础接口的Status属性,返回专属枚举类型 new TStatus Status { get; set; } IEnumerable<object> GetStuffByStatus(TStatus status); }
这样既可以用List<IDevice>存储所有设备,又能在需要时通过类型转换获取IDevice<TStatus>的专属状态和方法。
内容的提问来源于stack exchange,提问作者Luca Clavarino
相关产品推荐
相关产品推荐

