[英]Creating interface with generic methods
我正在嘗試設計一個接口,以便它具有泛型類型的id和泛型方法,該方法返回實現此接口的類的類型。 例如:
public interface IEntity <IDType, MethodReturnType>
{
IDType ID {get; set;}
MethodReturnType Get();
}
public class Model : IEntity<int, Model>
{
int ID {get; set; }
Model Get() { // do something }
}
我的問題是,將模型作為IEntity的第二個類型參數似乎很愚蠢,因為我已經在模型的類中,它應該是一些智能方法來確定它是什么類型(盡管使用泛型類型需要它在編譯時確定)。
是否有任何其他解決方案可以幫助我擺脫模型類型,同時在界面中保留Get方法定義?
您可以使用this.GetType()確定繼承的類類型,但這不允許您創建通用函數/參數/等。
所以對你的答案,不,你不能,除非你不以任何方式使用該類型(你仍然可以獲得類的基類型並使用它但不能將其設置為返回類型/參數類型/等)。
在這種情況下,有兩種典型的方法來設計類和接口。 我會稍微偏離你的確切例子,試圖讓答案更加通用。
選擇哪個選項實際上取決於您希望如何使用類和接口。
使您的界面通用,以便界面成員了解確切的類型。
public interface IEntity<TDescription>
{
TDescription Get();
}
public class MyModel : IEntity<MyDescription>
{
MyDescription Get() { ... }
}
public class MyDescription { ... }
這意味着當您使用IEntity<TDescription>
界面時,您需要在使用時了解TDescription
。 好處是您可以獲得更多的編譯時類型檢查。
不要使您的界面通用,而是讓您的界面成員也使用界面。
public interface IEntity
{
IDescription Get();
}
public interface IDescription { ... }
public class MyModel : IEntity
{
MyDescription Get() { ... }
IDescription IEntity.Get() { return this.Get(); }
}
public class MyDescription : IDescription { ... }
這更靈活,但也意味着更少的編譯時類型檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.