我想在我的vb.net接口中定義一個方法,它只接受從同一接口繼承的對象,也是同一個類作爲接收方法調用的實例。這是可能的vb.net?Vb.net接口,使方法只接受相同類型的參數
下面我試圖用(無效),一般類型的約束來說明什麼,我希望做的:
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
我想在我的vb.net接口中定義一個方法,它只接受從同一接口繼承的對象,也是同一個類作爲接收方法調用的實例。這是可能的vb.net?Vb.net接口,使方法只接受相同類型的參數
下面我試圖用(無效),一般類型的約束來說明什麼,我希望做的:
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
Public Interface IFoo(Of T)
CompareStuff(obj As T) As Boolean
使用這樣的:
Public Class Foo Implements IFoo(Of Foo)
Function CompareStuff(obj As Foo) As Boolean
但不幸的是還允許這編譯:
Public Class Bar Implements IFoo(Of Foo)
Function CompareStuff(obj As Foo) As Boolean
Can not想想現在有什麼適當的限制。
如果類型X
從Y
類型派生,以及一Y
可根據另一Y
執行一些操作,則里氏替換原則要求一個Y
必須能夠在一個X
執行相同的動作,同時又有一個X
絕能夠在Y
上執行相同的操作。將這些要求放在一起,X
必須能夠在另一個X
上執行該操作。
注意,這將是可能的X
能夠在另一個X
執行一些操作,但這樣的行動是通過,或經,一Y
可執行。順便提一句,儘管對結構和密封類實現IEquatable<T>
是有用的,但任何對象是否等於任何其他對象的問題都可以針對任何類型的任何兩個對象有意義地回答。例如,如果有一個集合Cat
,可以合理地嘗試將該集合中的對象與SiameseCat
類型的參數進行比較(同時該集合可能包含PersianCat
的實例,它也可能包含某些類型SiameseCat
)或類型Animal
(一些傳入的對象可能是Dog
類型,但其他傳入對象可能是Cat
類型)。在查詢Cat
的集合以查看它是否包含某些特定的Dog
可能是「愚蠢的」時,集合應該沒有問題來回答查詢(「發現零實例」)。
您在尋找Curiously recurring template pattern。
我對我的VB有點生疏,所以這裏是在C#
public interface IFoo<T>
where T : IFoo<T>
{
bool CompareStuff(T obj);
}
然後你實現它這樣
public class Foo : IFoo<Foo>
{
bool CompareStuff(Foo obj);
}
從埃裏克利珀退房this article它。請特別注意他所說的結尾:
我的建議是在C#中實現這種好奇的模式之前先考慮一下,給客戶帶來的好處是否真的超過了與您在代碼維護者身上產生的精神負擔相關的成本?
寫完這個問題後我也想到了這樣。它接近但不是所有的方式...... :)有沒有什麼辦法在C#(可以翻譯)做我想要的? – mortb
我不認爲C#在這種事情上更有表現力;這只是語法趨於更短:) – AakashM