3

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

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

Public Interface IFoo

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

End Interface
4

3 回答 3

4

您正在寻找Curiously recurring 模板模式

我对我的 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 的这篇文章。特别注意他说的结尾:

我的建议是在你用 C# 实现这种奇怪的模式之前要好好思考一下;给客户带来的好处真的超过了与代码维护者的精神负担相关的成本吗?

于 2012-07-03T19:12:04.677 回答
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

现在想不出任何适当的约束。

于 2012-07-03T09:27:57.547 回答
1

如果 typeX派生自 typeY并且 aY可以对另一个执行某些操作Y,那么 Liskov 替换原则要求 aY必须能够对 an 执行相同的操作X,并且 anX必须能够对 a 执行相同的操作Y。将这些要求放在一起,一个X必须能够对另一个执行该操作X

请注意, a 有可能X对另一个 执行某些操作X,而此类操作不能由 a 执行或在 a 上执行Y

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

于 2012-07-03T19:07:01.253 回答