如何将方法添加到VB.NET中实现类为参数类型的接口中?

如何将方法添加到VB.NET中实现类为参数类型的接口中?,vb.net,interface,Vb.net,Interface,我想编写一个接口,其中包含一个方法,该方法具有与实现类相同类型的参数 目前我使用的是: 公共接口IContent(共有) 函数ContentEquals(内容为IContent(Of T))作为布尔值 端接口 公共类特定内容 实现(特定的)IContent 私有m_成员作为字符串 公共函数ContentEquals(内容为IContent(特定的))作为布尔值实现IContent(特定的)。ContentEquals “实际上,我需要在这里访问content.m_成员 “这当然行不通 “因为不

我想编写一个接口,其中包含一个方法,该方法具有与实现类相同类型的参数

目前我使用的是:

公共接口IContent(共有)
函数ContentEquals(内容为IContent(Of T))作为布尔值
端接口
公共类特定内容
实现(特定的)IContent
私有m_成员作为字符串
公共函数ContentEquals(内容为IContent(特定的))作为布尔值实现IContent(特定的)。ContentEquals
“实际上,我需要在这里访问content.m_成员
“这当然行不通
“因为不是每个IContent(特定的)都有m_成员
只是因为具体内容确实如此。
返回真值
端函数
末级
问题是,此接口定义需要实现
ContentEquals
来接受实现
IContent(of Specific)
的任何类型的任何对象,而不仅仅是
SpecificContent
我实际想要定义的内容


有没有办法在接口
I
中定义一个方法,该方法对
a实现I
a
参数和
B执行I
B
。E类似于MyClass的
内容

不,没有。坦白说,这是件好事

想一想,你如何使用这样的界面?接口的要点是,无论实际实现接口的对象的类型如何,都可以调用特定的方法。如果接口包含一个绑定到其实现者类型的方法,您会将该接口存储在哪种类型的变量中?如果可以将其存储在变量中,如何将其传递给一个只知道接口而不知道推进器的方法?该方法将如何调用接口,它将作为参数传递什么


对于此类相等性测试,您应该重写
对象.Equals
方法,或者引入另一个显式接受您自己类型的
对象.Equals重载。您也可以使用接口,但参数的类型必须是
Object
,就像
Object一样。Equals

我找到了一个合适的方法来实现我想要的。解决方案是接口继承,以及作为参数类型的第二个泛型。我知道我以前也做过类似的事情,但那是用Java编写的,我记不清了

以下是我的界面:

公共接口IContentFactory(属于T,S作为IContent(属于T))
函数CreateFrom(对象为T)作为IComparableContent(属于T,S)
端接口
公共接口IContent(Of T)
子应用程序(obj As T)
端接口
公共接口IComparableContent(属于T,S作为IContent(属于T))
继承(T的)IContent
函数ContentEquals(内容为S)为布尔值
端接口
在我的代码中,我可以将这些接口用于通用内容处理类:

公共类ContentHistory(T的,S作为i内容(T的))
私人m_Obj As T
作为IContentFactory的私营m_工厂(T,S)
私有m_历史作为堆栈(IComparableContent的,T的,S的))
新建公共子工厂(obj作为T,工厂作为IContentFactory(属于T,S))
如果obj为Nothing,则抛出新的ArgumentNullException(“obj”)
如果factory为Nothing,则抛出新的ArgumentNullException(“factory”)
m_Obj=Obj
m_工厂=工厂
m_History=新堆栈(i比较内容(T,S))
端接头
公共子备份()
Dim currentContent=m_Factory.CreateFrom(m_Obj)
如果m_History.Count=0或不是m_History.Peek().ContentEquals(currentContent),则
m_History.Push(当前内容)
如果结束
端函数
私有子还原()
如果m_History.Count>0,则
m_History.Pop().ApplyTo(m_Obj)
如果结束
端函数
末级
现在,我可以为内容对象及其工厂实现特定类,如下所示:

公共类SpecificContentFactory
实现IContentFactory(特定的、特定的内容)
公共函数CreateFrom(obj作为特定对象)作为IComparableContent(针对特定内容)实现IContentFactory(针对特定内容)。CreateFrom
返回新的特定内容(obj)
端函数
末级
公共类特定内容
实现(特定、特定内容的)IComparableContent
私有只读m_值作为字符串
朋友子新(obj具体)
m_值=目标值
端接头
Public Sub ApplyTo(obj As Specific)实现IContent(Of Specific)。ApplyTo
对象值=m_值
端接头
作为布尔值的公共函数ContentEquals(作为SpecificContent的内容)实现了IComparableContent(作为SpecificContent的内容)。ContentEquals
返回(content.m_值=m_值)
端函数
末级
要设置此内容处理程序,我所要做的就是

Dim obj=New Specific()
Dim history=新内容历史记录(针对特定内容)(obj,新的特定内容工厂())
我可以像这样使用它

obj.Value=“OldValue”
历史,备份
对象值=“旧值”
历史,备份,什么都没发生
obj.Value=“NewValue”
历史,备份
obj.Value=“EvenNewerValue”
尺寸值=对象值“EvenNewerValue”
历史。还原
value=对象值“NewValue”
历史。还原
值=对象值“旧值”
历史。还原“什么都没有发生
值=对象值“旧值”

只要我提供了
SpecificContent
SpecificContentFactory
实现,我就可以使用
ContentHistory(特定的,SpecificContent)
对于任何类型,如
Specific
我喜欢的。

这似乎是一个无限递归,也就是堆栈溢出,这是有意义的,特别是带有“将特定对象存储在接口类型的变量中”的部分。我会重新考虑我的设计,我想我会实现我的
ContentEquals