我有約束的問題,因爲我想,類型參數是一個引用類型只是三個類之一,而不是任何其他,所以約束「其中L:class」是不好。類型參數的約束 - 其中T:類
這裏是例子:
public class MyClass <L>
where L : Circle
where L: Rectangle
where L: Triangle
這意味着,必須符合所有約束。不幸的是,我還沒有找到答案。
非常感謝。
我有約束的問題,因爲我想,類型參數是一個引用類型只是三個類之一,而不是任何其他,所以約束「其中L:class」是不好。類型參數的約束 - 其中T:類
這裏是例子:
public class MyClass <L>
where L : Circle
where L: Rectangle
where L: Triangle
這意味着,必須符合所有約束。不幸的是,我還沒有找到答案。
非常感謝。
您應該創建一個基類或接口,Circle
,Rectangle
和Triangle
從中繼承。
例如:
interface IShape
{
}
class Circle : IShape
{
// ...
}
class Rectangle : IShape
{
// ...
}
class Triangle : IShape
{
// ...
}
然後做IShape
約束:
public class MyClass <L>
where L : IShape
要添加到此:如果無法訪問'Circle','Rectangle'和/或'Triangle'的源代碼,您仍然可以繼承這些類型並在派生類型中實現接口,前提是它們不是密封 –
可能這三種形狀共用通用代碼,如座標或顏色。這些常見的東西肯定屬於抽象基類。 (這個基類仍然可以實現這個接口。) –
做那些3類('Circle','Rectangle','Triangle')共享一個共同的祖先? – dcastro
您確定要讓課程符合*所有*約束,而不是任何約束嗎?換句話說,你確定你想讓這個類從所有三個'Circle','Rectangle'和'Triangle'派生嗎? – hvd
你所描述的是一個聯合類型,而C#不支持這些,而OO並不真正適用於封閉的層次結構。你可以使用F#代替,或者如果你控制所有的代碼,然後定義一個基類/接口,並添加三個擴展類型'圓形','矩形'和'三角形'。 – Lee