也許是一個有點奇怪的問題。
我有一個介面 IReservable,它描述了使物件“可保留”的行為。實作它的類必須有一個保留串列,以及一些處理創建/洗掉保留的方法。介面宣告了一個保留串列,它是一個抽象類,由2個具體類繼承;一個用于房間,一個用于椅子 (RoomReservation & ChairReservation)。
房間和椅子類都實作了 IReservable,并且都將始終只創建一種型別的實體(Chair -> ChairReservation 和 Room -> RoomReservation)
有沒有辦法讓 IReservable 要求有一個 Reservation 串列,但實作可以決定具體的 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; }
}
沒有必要這樣做,但我仍然想知道它是否真的可能;因為我找不到任何例子。
uj5u.com熱心網友回復:
你可以通過使用泛型來做到這一點。例如
首先讓我們假設你有一些這樣的類:
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; }
}
現在你的Room和Seat類將是這樣的:
public class Room : IReservable<RoomReservation>
{
public ICollection<RoomReservation> Reservations { get; set; }
}
public class Seat : IReservable<ChairReservation>
{
public ICollection<ChairReservation> Reservations { get; set; }
}
uj5u.com熱心網友回復:
即使建議的通用介面技術有效,我通常也很難處理通用介面。介面的優點之一是多型性。通過使用通用介面,您的不同實作將不會有共同的基型別,因此您將失去多型性。即,你不能這樣做:
IReservable reservable;
reservable = new Room();
reservable = new Seat();
Console.WriteLine(reservable.Reservations.Count);
如果您從未打算利用多型性,使用通用介面就足夠了(但是,您可能會問自己為什么在這種情況下需要介面)。否則我的建議是使用兩種不同的界面,一種用于閱讀預訂,一種用于閱讀和修改:
interface IReservable
{
IEnumerable<Reservation> Reservations { get; }
}
interface IReservable<TReservation> : IReservable
where TReservation : Reservation
{
new ICollection<TReservation> Reservations { get; }
// Reservation methods
}
public class Room : IReservable<RoomReservation>
{
public ICollection<RoomReservation> Reservations { get; }
IEnumerable<Reservation> IReservable.Reservations => Reservations;
}
然后你就可以使用多型了。
uj5u.com熱心網友回復:
我認為這里使用泛型的最佳解決方案是@DavidG在這里展示的
但是如果由于某種原因你不能使用泛型,你可以使用顯式介面實作
它會是這樣的:
public class Room : IReservable
{
IEnumerable<Reservation> reservations;
ICollection<Reservation> IReservable.Reservations { get { return (ICollection<Reservation>)reservations; } set { reservations = value; } }
public ICollection<RoomReservation> Reservations { get { return (ICollection<RoomReservation>)reservations.Cast<RoomReservation>(); } set { reservations = value; } }
}
public class Seat : IReservable
{
IEnumerable<Reservation> reservations;
ICollection<Reservation> IReservable.Reservations { get { return (ICollection<Reservation>)reservations; } set { reservations = value; } }
public ICollection<SeatReservation> Reservations { get { return (ICollection<SeatReservation>)reservations.Cast<SeatReservation>(); } set { reservations = value; } }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317080.html
