C#中接口的抽象类类型属性能否实现为对应的具体子类?
实现方案
完全可以实现,使用带类型约束的泛型接口即可在编译期完成类型校验,保证不同实现类的Reservations集合只能存储对应子类的预订实例。
核心实现代码
// 给接口添加泛型参数,约束泛型必须继承自Reservation抽象类 public interface IReservable<T> where T : Reservation { ICollection<T> Reservations { get; set; } // 其余方法可保持不变 } public class Room : IReservable<RoomReservation> { // 这里集合已经限定为仅能存储RoomReservation类型 public ICollection<RoomReservation> Reservations { get; set; } = new List<RoomReservation>(); } public class Seat : IReservable<ChairReservation> { // 这里集合已经限定为仅能存储ChairReservation类型 public ICollection<ChairReservation> Reservations { get; set; } = new List<ChairReservation>(); }
兼容统一处理场景的优化
如果你有需要统一遍历所有IReservable实例的通用逻辑,不想受泛型参数限制,可以额外加一层非泛型的基础接口:
// 非泛型基础接口,用于暴露通用的预订访问能力 public interface IReservable { IReadOnlyCollection<Reservation> GetReservations(); } // 泛型接口继承非泛型接口 public interface IReservable<T> : IReservable where T : Reservation { ICollection<T> Reservations { get; set; } } // 实现类补全非泛型接口方法即可 public class Room : IReservable<RoomReservation> { public ICollection<RoomReservation> Reservations { get; set; } = new List<RoomReservation>(); public IReadOnlyCollection<Reservation> GetReservations() { return Reservations.AsReadOnly(); } }
额外说明
- 如果你只需要读取集合不需要修改,可以给泛型参数添加
out关键字声明协变,此时IReservable<RoomReservation>可以直接隐式转换为IReservable<Reservation>使用,灵活度更高 - 该方案完全在编译期做类型校验,比在非泛型集合中添加运行时类型判断的方案性能更高、安全性更好
内容的提问来源于stack exchange,提问作者Nicolas Van Damme
相关产品推荐
相关产品推荐

