Phone 和 Computer 類都實作了 IDevice 介面。
Phone 具有 PhoneStatus 列舉屬性,而 Computer 具有 ComputerStatus 列舉屬性。此外,它們都有一個方法可以根據它們的狀態屬性回傳一些東西。
class Phone : IDevice
{
public string Name { get; set; }
public string Manufacturer { get; set; }
public PhoneStatus Status { get; set; }
IEnumerable<object> GetStuffByStatus(PhoneStatus status)
{
...
}
}
enum PhoneStatus
{
On,
Off
}
class Computer : IDevice
{
public string Name { get; set; }
public string Manufacturer { get; set; }
public ComputerStatus Status { get; set; }
IEnumerable<object> GetStuffByStatus(ComputerStatus status)
{
...
}
}
enum ComputerStatus
{
Started,
ShutDown,
Booting,
ShuttingDown
}
我知道繼承不是列舉的選項,所以問題是:有沒有辦法強制實作 IDevice 的類撰寫自己的 DeviceStatus 屬性(可以實作為 PhoneStatus 或 ComputerStatus)和 GetStuffByStatus 方法?像這樣的東西
interface IDevice
{
string Name { get; set; }
string Manufacturer { get; set;}
DeviceStatus Status { get; set;}
IEnumerable<object> GetStuffByStatus(DeviceStatus status);
}
uj5u.com熱心網友回復:
你可以嘗試這樣的事情:
public interface IDevice<T> where T: Enum
{
string Name { get; set; }
string Manufacturer { get; set; }
T Status { get; set; }
IEnumerable<object> GetStuffByStatus(T status);
}
然后實作類必須為狀態宣告某種列舉:
public 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)
{
throw new NotImplementedException();
}
}
如果需要,您可以將不依賴于 Status 列舉的公共部分提取到基本介面中:
public interface IDevice
{
string Name { get; set; }
string Manufacturer { get; set; }
}
public interface IDeviceWithStatus<T>: IDevice where T: Enum
{
T Status { get; set; }
IEnumerable<object> GetStuffByStatus(T status);
}
然后,您仍然可以通過 訪問公共部分和通過 訪問IDevice與狀態相關的部分IDeviceWithStatus<T>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519735.html
標籤:C#遗产枚举界面
上一篇:為什么繼承會破壞訪問權限
下一篇:實作細節繼承?
