c# - [抽象类] 类型的接口(interface)属性是否可以在 C# 中实现为具体类?

标签 c# c#-8.0

也许是个奇怪的问题。

我有一个 IReservable 接口(interface),它描述了使对象“可保留”的行为。实现它的类必须有一个预订列表,以及一些处理创建/删除预订的方法。该接口(interface)声明了一个保留列表,它是一个抽象类,继承了2个具体类;一个用于房间,一个用于椅子(RoomReservation & ChairReservation)。

room 和 chair 类都实现了 IReservable,并且都只会创建一种类型的实例(Chair -> ChairReservation 和 Room -> RoomReservation)

有没有办法让 IReservable 要求有一个 Reservations 列表,但实现可以决定具体的 Reservation?

在代码中解释:

public interface IReservable
{
    ICollection<Reservation> Reservations { get; set; }
    
    // Rest omitted for brevity
}

public class Room : IReservable
{
    // Can I make this RoomReservation only?
    public ICollection<Reservation> Reservations { get; set; }
}

public class Seat : IReservable
{
    // And can I make this ChairReservation only?
    public ICollection<Reservation> Reservations { get; set; }
}

没有必要这样做,但我仍然想知道这是否真的可能;因为我找不到任何例子。

最佳答案

您可以使用泛型来做到这一点。例如

首先让我们假设您有一些这样的类:

public abstract class Reservation { }

public class ChairReservation : Reservation { }
public class RoomReservation : Reservation { }

现在您的界面会变成这样,请注意类型约束以确保预订始终派生自 Reservation:

public interface IReservable<TReservation> 
    where TReservation : Reservation
{
    ICollection<TReservation> Reservations { get; set; }
}

现在你的 RoomSeat 类应该是这样的:

public class Room : IReservable<RoomReservation>
{
    public ICollection<RoomReservation> Reservations { get; set; }
}

public class Seat : IReservable<ChairReservation>
{
    public ICollection<ChairReservation> Reservations { get; set; }
}

关于c# - [抽象类] 类型的接口(interface)属性是否可以在 C# 中实现为具体类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69582647/

相关文章:

c# - 如何在 C# 中实现 MaxSubArray?

c# - 将 png 转换为高质量的 ico

C#8 可空和不可空引用类型 - 仅当输入可为空时输出可为空

c# - .net 核心中是否有任何公共(public) MemberNotNull/MemberNotNullWhen 属性

c# - 自托管 Web API 的正确方法是什么?

c# - 在构造函数中创建防御副本

c# - 如何使用c#添加递归函数从Mysql获取列

C# 8 默认实现和依赖倒置

c# - 具有 C#8 默认接口(interface)实现/特征的事件继承

c# - 可空引用类型 : "Try" method pattern, 在返回 false 时收到 null 警告