2014-03-31 62 views
2

我有約束的問題,因爲我想,類型參數是一個引用類型只是三個類之一,而不是任何其他,所以約束「其中L:class」是不好。類型參數的約束 - 其中T:類

這裏是例子:

public class MyClass <L> 
     where L : Circle 
     where L: Rectangle 
     where L: Triangle 

這意味着,必須符合所有約束。不幸的是,我還沒有找到答案。

非常感謝。

+1

做那些3類('Circle','Rectangle','Triangle')共享一個共同的祖先? – dcastro

+0

您確定要讓課程符合*所有*約束,而不是任何約束嗎?換句話說,你確定你想讓這個類從所有三個'Circle','Rectangle'和'Triangle'派生嗎? – hvd

+0

你所描述的是一個聯合類型,而C#不支持這些,而OO並不真正適用於封閉的層次結構。你可以使用F#代替,或者如果你控制所有的代碼,然後定義一個基類/接口,並添加三個擴展類型'圓形','矩形'和'三角形'。 – Lee

回答

6

您應該創建一個基類或接口,Circle,RectangleTriangle從中繼承。

例如:

interface IShape 
{ 
} 

class Circle : IShape 
{ 
    // ... 
} 

class Rectangle : IShape 
{ 
    // ... 
} 

class Triangle : IShape 
{ 
    // ... 
} 

然後做IShape約束:

public class MyClass <L> 
    where L : IShape 
+1

要添加到此:如果無法訪問'Circle','Rectangle'和/或'Triangle'的源代碼,您仍然可以繼承這些類型並在派生類型中實現接口,前提是它們不是密封 –

+0

可能這三種形狀共用通用代碼,如座標或顏色。這些常見的東西肯定屬於抽象基類。 (這個基類仍然可以實現這個接口。) –

相關問題