2011-04-14 98 views
1

我想這段代碼從Java轉換成C#,我無法找到正確的synthaxC#模板參數作爲模板接口

的Java:

public class MyClass<T extends IMyInterface<T>> 

我在翻譯成嘗試C#:

public class MyClass<T, U> where T: IMyInterface<U> 

如果我做public class MyClass<T> where T: IMyInterface<T>,有類聲明沒有編譯錯誤,但我無法弄清楚如何使用類。

更具體地說,我有一個接口IPoint<T>,它由EuclideanPoint:IPoint<EuclideanPoint>類實現。此外,我有一個模板類Clusterer<U>,它不應該關心接口的模板參數,它應該只確保U是類型IPoint。

謝謝。

+0

它是一個將實現IMyInterface的類嗎? – 2011-04-14 18:28:44

+0

public class MyClass :IMyInterface ? – 2011-04-14 18:29:44

+0

不,我沒有試圖實現一個接口。我嘗試使用e模板接口作爲模板類的類型參數 – cvlad 2011-04-14 18:33:42

回答

3

不,C#相當於在Java的也只是:在Java

public class MyClass<T> where T : IMyInterface<T> 

一類參數,一個在C#中。

你如何使用這個類將取決於什麼IMyInterface<T>是什麼以及實現它。例如,如果它是IEquatable<T>,您可以創建一個MyClass<int>,因爲int實現了IEquatable<int>

+0

我試過這個版本,但是當我嘗試這樣做時:MyClass > c = new MyClass >(),我得到類似於「沒有從'IMyInterface '到'IMyInterface >'的隱式引用轉換,其中T是另一個模板參數 – cvlad 2011-04-14 18:40:36

+1

@ratzinho:不,這是正確的 - 因爲它可能類似於Foo類:IMyInterface '這不符合合同。如果你能解釋你想要達到的目標,那真的很有幫助。 – 2011-04-14 18:41:52

+0

你的提示非常有幫助。我設法做到這一點:MyContainerClass 其中T:IMyInterface 然後,在MyContainerClass中,我實例化類如下:MyClass c = new MyClass () – cvlad 2011-04-14 18:58:37

2
class MyClass<T> where T: IMyInterface<T> 

看起來不錯。

如果你有

class MySecondClass : IMyInterface<MySecondClass> 
{ 

} 

那麼你可以使用

MyClass<MySecondClass> obj = new MyClass<MySecondClass>();