2012-07-03 174 views
3

我想在我的vb.net接口中定義一個方法,它只接受從同一接口繼承的對象,也是同一個類作爲接收方法調用的實例。這是可能的vb.net?Vb.net接口,使方法只接受相同類型的參數

下面我試圖用(無效),一般類型的約束來說明什麼,我希望做的:

Public Interface IFoo 

    CompareStuff(Of T as sametype)(obj as T) as Boolean 

End Interface 

回答

2
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想想現在有什麼適當的限制。

+0

寫完這個問題後我也想到了這樣。它接近但不是所有的方式...... :)有沒有什麼辦法在C#(可以翻譯)做我想要的? – mortb

+0

我不認爲C#在這種事情上更有表現力;這只是語法趨於更短:) – AakashM

1

如果類型XY類型派生,以及一Y可根據另一Y執行一些操作,則里氏替換原則要求一個Y必須能夠在一個X執行相同的動作,同時又有一個X絕能夠在Y上執行相同的操作。將這些要求放在一起,X必須能夠在另一個X上執行該操作。

注意,這將是可能的X能夠在另一個X執行一些操作,但這樣的行動是通過,或經,一Y可執行。順便提一句,儘管對結構和密封類實現IEquatable<T>是有用的,但任何對象是否等於任何其他對象的問題都可以針對任何類型的任何兩個對象有意義地回答。例如,如果有一個集合Cat,可以合理地嘗試將該集合中的對象與SiameseCat類型的參數進行比較(同時該集合可能包含PersianCat的實例,它也可能包含某些類型SiameseCat)或類型Animal (一些傳入的對象可能是Dog類型,但其他傳入對象可能是Cat類型)。在查詢Cat的集合以查看它是否包含某些特定的Dog可能是「愚蠢的」時,集合應該沒有問題來回答查詢(「發現零實例」)。

4

您在尋找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#中實現這種好奇的模式之前先考慮一下,給客戶帶來的好處是否真的超過了與您在代碼維護者身上產生的精神負擔相關的成本?

相關問題