2012-07-03 50 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#中实现这种好奇的模式之前先考虑一下,给客户带来的好处是否真的超过了与您在代码维护者身上产生的精神负担相关的成本?

相关问题