我想在我的vb.net接口中定义一个方法,它只接受从同一接口继承的对象,也是同一个类作为接收方法调用的实例。这是可能的vb.net?Vb.net接口,使方法只接受相同类型的参数
下面我试图用(无效),一般类型的约束来说明什么,我希望做的:
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
我想在我的vb.net接口中定义一个方法,它只接受从同一接口继承的对象,也是同一个类作为接收方法调用的实例。这是可能的vb.net?Vb.net接口,使方法只接受相同类型的参数
下面我试图用(无效),一般类型的约束来说明什么,我希望做的:
Public Interface IFoo
CompareStuff(Of T as sametype)(obj as T) as Boolean
End Interface
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想想现在有什么适当的限制。
如果类型X
从Y
类型派生,以及一Y
可根据另一Y
执行一些操作,则里氏替换原则要求一个Y
必须能够在一个X
执行相同的动作,同时又有一个X
绝能够在Y
上执行相同的操作。将这些要求放在一起,X
必须能够在另一个X
上执行该操作。
注意,这将是可能的X
能够在另一个X
执行一些操作,但这样的行动是通过,或经,一Y
可执行。顺便提一句,尽管对结构和密封类实现IEquatable<T>
是有用的,但任何对象是否等于任何其他对象的问题都可以针对任何类型的任何两个对象有意义地回答。例如,如果有一个集合Cat
,可以合理地尝试将该集合中的对象与SiameseCat
类型的参数进行比较(同时该集合可能包含PersianCat
的实例,它也可能包含某些类型SiameseCat
)或类型Animal
(一些传入的对象可能是Dog
类型,但其他传入对象可能是Cat
类型)。在查询Cat
的集合以查看它是否包含某些特定的Dog
可能是“愚蠢的”时,集合应该没有问题来回答查询(“发现零实例”)。
您在寻找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#中实现这种好奇的模式之前先考虑一下,给客户带来的好处是否真的超过了与您在代码维护者身上产生的精神负担相关的成本?
写完这个问题后我也想到了这样。它接近但不是所有的方式...... :)有没有什么办法在C#(可以翻译)做我想要的? – mortb
我不认为C#在这种事情上更有表现力;这只是语法趋于更短:) – AakashM