簡體   English   中英

使用泛型方法創建接口

[英]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()確定繼承的類類型,但這不允許您創建通用函數/參數/等。

所以對你的答案,不,你不能,除非你不以任何方式使用該類型(你仍然可以獲得類的基類型並使用它但不能將其設置為返回類型/參數類型/等)。

在這種情況下,有兩種典型的方法來設計類和接口。 我會稍微偏離你的確切例子,試圖讓答案更加通用。

選擇哪個選項實際上取決於您希望如何使用類和接口。

選項1

使您的界面通用,以便界面成員了解確切的類型。

public interface IEntity<TDescription>
{
    TDescription Get();
}

public class MyModel : IEntity<MyDescription>
{
     MyDescription Get() { ... }
}

public class MyDescription { ... }

這意味着當您使用IEntity<TDescription>界面時,您需要在使用時了解TDescription 好處是您可以獲得更多的編譯時類型檢查。

選項2

不要使您的界面通用,而是讓您的界面成員也使用界面。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM