Vb.net接口,make方法只接受与参数相同类型的实例

时间:2012-07-03 09:02:41

标签: .net vb.net generics types

我正在尝试在我的vb.net接口中定义一个方法,该方法只接受从同一接口继承的对象,并且与接收方法调用的实例属于同一个类。这在vb.net中是否可行?

下面我尝试用(无效的)泛型类型约束来说明我想做的事情:

Public Interface IFoo

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

End Interface

3 个答案:

答案 0 :(得分: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);
}

从Eric Lippert查看this article有关它的信息。特别注意他说的结尾:

  

我的建议是在C#中实现这种奇怪的模式之前要认真思考;对客户带来的好处是否真的超过了与代理维护者的精神负担相关的成本?

答案 1 :(得分: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

现在想不出任何正确的约束。

答案 2 :(得分:1)

如果类型X派生自类型Y,而Y可以对另一个Y执行某些操作,则Liskov替换原则要求Y必须能够在X上执行相同的操作,并且X必须能够在Y上执行相同的操作。将这些要求放在一起,X必须能够在另一个X上执行该操作。

请注意,X可以在另一个X上执行某些操作,而Y无法执行此类操作。

顺便提一下,虽然对结构和密封类实现IEquatable<T>很有用,但对于任何类型的任何两个对象,可以有意义地回答任何对象是否与任何其他对象相等的问题。例如,如果一个集合具有Cat,则可以合理地尝试将该集合中的对象与类型SiameseCat的参数进行比较(而集合可能包含PersianCat的实例,它可能还包含某些类型SiameseCat)或类型Animal(某些传入的对象可能是Dog类型。但其他对象可能是Cat类型)。查询Cat的集合以查看它是否包含某些特定的Dog可能是“愚蠢的”,该集合在回答查询时应该没有问题(“找到零实例”)。