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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:18:02