我正在尝试在我的vb.net接口中定义一个方法,该方法只接受从同一接口继承的对象,并且与接收方法调用的实例属于同一个类。这在vb.net中是否可行?
下面我尝试用(无效的)泛型类型约束来说明我想做的事情:
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
答案 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
无法执行此类操作。1} p>
顺便提一下,虽然对结构和密封类实现IEquatable<T>
很有用,但对于任何类型的任何两个对象,可以有意义地回答任何对象是否与任何其他对象相等的问题。例如,如果一个集合具有Cat
,则可以合理地尝试将该集合中的对象与类型SiameseCat
的参数进行比较(而集合可能包含PersianCat
的实例,它可能还包含某些类型SiameseCat
)或类型Animal
(某些传入的对象可能是Dog
类型。但其他对象可能是Cat
类型)。查询Cat
的集合以查看它是否包含某些特定的Dog
可能是“愚蠢的”,该集合在回答查询时应该没有问题(“找到零实例”)。