2011-03-09 63 views
5

我想知道這個代碼是否可以改進。 IProvider實現IProvider並覆蓋請求(...)。我想將這些組合到一個界面中。但我仍然需要一個類型化的非類型化接口來處理。是否可以定義一個非泛型接口,它可以有泛型方法?

有沒有一種方法可以將兩者結合起來,還是將這些界面看起來如何?

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 

public interface IProvider<T> : IProvider 
{ 
    new IResult<T> Request(IQuery request); 
} 
+0

我跟着你們的指示,並按我的意願工作。我只能給1個贏家。抱歉。 – phillip 2011-03-09 15:36:16

+0

下次你可能想要再次檢查「最老」的老闆。 – VulgarBinary 2011-03-09 16:06:52

+0

你編輯你的後他的,這就是他爲什麼得到支票。 – phillip 2011-03-09 17:11:26

回答

5

如果泛型類型參數T只在Request方法的上下文相關的,只聲明該方法作爲一般:

public interface IProvider 
{ 
    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 

    IResult<T> Request<T>(IQuery request); 
} 
+0

好的。很高興知道......謝謝。 – phillip 2011-03-09 15:33:31

+0

誰投我的票:沒用,如果你不解釋,你爲什麼這麼做!尤其是,答案已經被接受了......! – 2011-03-09 21:05:15

+0

我認爲這是一個庸俗的混血兒......他在談論如何選擇他的答案,現在他的咆哮聲被刪除。我想另一位成員可能剛剛刪除了他不必要的評論 - 不確定。 – phillip 2011-03-09 21:49:28

2

如果你想有執行無類型代碼,你不能把一個泛型類中該方法的能力(並有它仍然是有意義的設計方式)。所以答案是否定的......當你需要無類型和類型的接口時,你擁有的是正確的方法。

但是你可以有初始界面的參考,或他們都擀成一個單一的接口,但你非類型化的方法仍然有一個泛型類中聲明,即:

ObjectProvider<SomeObjectType> j = new ObjectProvider<SomeObjectType>(); 
j.DataSource = //Do something 

現在,你總是可以將Request指定爲一種通用方法,並允許兩者存在於相同的上下文中......但是......最終由您決定。

public interface IProvider 
{ 
    IResult<T> Request<T>(IQuery request); 

    DataSourceDescriptor DataSource { get; set; } 

    IConfiguration Configuration { get; set; } 

    IResult Request(IQuery request); 
} 
+0

很好的答案。謝謝回覆。 – phillip 2011-03-09 15:33:52

0

其實,實現接口意味着你要離開底座接口的孩子也是這樣 - 繼承當然也是這樣。

那麼,當你通過某個類來實現你的孩子(通用)接口時會發生什麼?當然,你會在實現類中獲得泛型成員和非泛型成員,根據我的理解,這不完全是你想要的。

解決方案:

  1. 聲明基本接口(例如IProviderBase)含有 「數據源」 和 「配置」 只有成員。
  2. 使IProvider成爲IProviderBase的子項並在其中聲明非泛型的Request()。
  3. 使IProvider <T> IProviderBase的子,並在其中聲明通用請求<T>()。

有意義嗎?

相關問題