2013-11-02 95 views
1

我創建了一個名爲MostRecentStack<T>的類,它是一個只保留一定數量項目的堆棧,將最下面的項目放在底部以騰出空間給新的項目。我想有一個變量,可以存儲對常規(「無限」)堆棧的引用,也可以根據具體情況存儲一個自定義類型,但C#沒有定義通用的「堆棧」接口。通常這不會是一個問題,但我想System.Collections.Generic.Stack<T>來實現接口。聲明一個接口是由一個類實現的

只要一個類提供所需的成員,在接口定義中,是否有任何方法告訴編譯器將類視爲實現接口?我希望能夠做到這一點,而無需使用as或其他類型轉換方法。

+0

要實現一個接口,一個類需要聲明爲實現接口,所以你想要的是不可能的。你可以從System.Collections.Generic.Stack 中派生一個類,它除了實現新的接口外什麼都不做。然後,您可以在代碼中使用派生類代替System.Collections.Generic.Stack 。 – Baldrick

+0

好主意!如果沒有人有更好的想法,您應該將其作爲答案提交,但我可以將其標記爲已接受。謝謝! – flarn2006

+0

非常高興這是有幫助的,我已經添加它作爲答案。 – Baldrick

回答

4

你要求的確切的事情是不可能的。然而,像應該是非常相似,你想要什麼:

public class CompatibleStack<T> : System.Collections.Generic.Stack<T>, IYourStackInterface<T> 
{ 
} 

的CompatibleStack在功能上等同於System.Collections.Generic.Stack,但它現在實現IYourStackInterface。

只要System.Collections.Generic.Stack具有實現IYourStackInterface的所有成員,就可以很好地編譯。你可以通過一個CompatibleStack作爲IYourStackInterface而沒有任何問題。

+0

接受,因爲這是我最終做的。再次感謝! – flarn2006

4

不,不可能將新界面添加到您不擁有的現有類。選項:

  • 如果您通過某個依賴注入控制器獲得該類的實例,則可以通過調用匹配方法來實現接口的代理。
  • 你可以簡單地從現有的類和添加接口(如果它沒有密封)派生並開始使用你的類。
  • 在你的特殊情況下,Baldrick指出你可以做反向 - 從現有類和實現接口派生。
  • 您可以嘗試使用dynamic來獲得一些鴨子打字(因爲這兩個類將具有匹配的方法)以獲得一些性能,可讀性和強類型成本。

邊注:一般C#不支持鴨打字,但其中實現接口要求不嚴格的一例(foreach) - 只是有關於收集正確的方法,就足以支持foreach

+1

不只是一個('foreach'):當使用查詢理解語法時,也適用於LINQ運算符('where,'select'等)和'await'(當使用async時)。 –