.net 类/结构来实现递归接口
我需要一个接口,其中包括函数,采取相同的接口类型作为参数。可能吗 基本上是这样做的:.net 类/结构来实现递归接口,.net,vb.net,generics,.net,Vb.net,Generics,我需要一个接口,其中包括函数,采取相同的接口类型作为参数。可能吗 基本上是这样做的: Public Interface ICopiable Sub CopyFrom(ByVal MyObject As ICopiable) End Interface Public Structure User Implements ICopiable Public Property Name As String Public Property Surname As Strin
Public Interface ICopiable
Sub CopyFrom(ByVal MyObject As ICopiable)
End Interface
Public Structure User
Implements ICopiable
Public Property Name As String
Public Property Surname As String
'# Copy all Member values from another Structure of same Type
Public Sub CopyFrom(MyUser As User) Implements ICopiable.CopyFrom
Me.Name = MyUser.Name
Me.Surname = MyUser.Surname
End Sub
End Structure
目前,我在Implements ICopiable.CopyFrom
上遇到以下错误:
“CopyFrom”无法实现“CopyFrom”,因为接口“ICopiable”上没有匹配的子项
我觉得这与循环引用有关,在循环引用中,Sub
的参数只有在User
被识别为ICopiable
接口时才会被识别为ICopiable
接口,直到接受Sub
参数后才会发生这种情况
除了用对象
替换接口
外,是否有其他解决方法?也许是演员
Public Interface ICopiable
Sub CopyFrom(ByVal MyObject As Object)
End Interface
编辑 我认为我的思考过程中存在一个缺陷:
CopyFrom()
只能从相同类型的对象进行复制
也就是说,
User.CopyFrom(User)
,而我定义界面的方式是User.CopyFrom(AnyICopiable)
,也就是说,界面
表示拥有User.CopyFrom(另一个同样可注册的对象)
是可以接受的。这是错误的。我认为这正是您需要的:
Public Interface ICopyable(Of T As ICopyable(Of T))
Sub CopyFrom(source As T)
End Interface
Public Structure User
Implements ICopyable(Of User)
Public Property Name As String
Public Property Surname As String
Public Sub CopyFrom(source As User) Implements ICopyable(Of User).CopyFrom
Me.Name = source.Name
Me.Surname = source.Surname
End Sub
End Structure
这就是像IComparable(Of T)
这样的接口的实现方式,例如String
类和Integer
结构分别实现IComparable(Of String)
和IComparable(Of Integer)
。话虽如此,我不确定这样的接口是否有泛型类型约束,因此,理论上,一个类型可以实现为与其他类型类似。在这种情况下,约束,即作为ICopyable(Of T)
部分,确保实现此接口的类型只能从相同类型的另一个实例复制
编辑:
如果您已经有这样的方法:
Public Sub DoSomething(copyable As ICopyable)
'...
End Sub
Dim user2 As User
user2.CopyFrom(user1)
DoSomething(user2)
Public Sub DoSomething(Of T As ICopyable(Of T))(copyable As T)
'...
End Sub
您想这样称呼它:
Public Sub DoSomething(copyable As ICopyable)
'...
End Sub
Dim user2 As User
user2.CopyFrom(user1)
DoSomething(user2)
Public Sub DoSomething(Of T As ICopyable(Of T))(copyable As T)
'...
End Sub
然后,要使用我的解决方案,只需将方法更改为如下所示:
Public Sub DoSomething(copyable As ICopyable)
'...
End Sub
Dim user2 As User
user2.CopyFrom(user1)
DoSomething(user2)
Public Sub DoSomething(Of T As ICopyable(Of T))(copyable As T)
'...
End Sub
电话号码将保持不变。您仍然可以调用该方法并传递实现ICopyable(Of T)
接口的任何对象。与大多数泛型方法调用一样,T
将根据用法推断出来。没有泛型的解决方案会这样做,但我希望尽可能避免:
Public Interface ICopiable
Sub CopyFrom(ByVal MyObject As Object)
End Interface
Public Structure User
Implements ICopiable
Public Property Name As String
Public Property Surname As String
'# Copy all Member values from another Structure of same Type
Public Sub CopyFrom(Of T as ICopiable)(MyUser As Object) Implements ICopiable.CopyFrom
If Not TypeOf MyUser Is User Then Throw New ArgumentException("Object Type must be User", "MyUser")
Me.Name = MyUser.Name
Me.Surname = MyUser.Surname
End Sub
End Structure
以接口中定义的方式实现CopyFrom
方法是否存在问题Public Sub CopyFrom(MyObject作为ICopiable)实现了ICopiable。CopyFrom
HavinPublic Sub CopyFrom(MyUser作为ICopiable)实现了ICopiable。CopyFrom
也返回了同样的错误。你击败了我:)是的,我也觉得解决方案将通过泛型实现。。例如,接口和实现它的结构中的子CopyFrom(Of T)(ByVal MyObject As Object)
。您的解决方案不适用于我,因为我有一些函数将ICopiable
作为参数,并且我希望它与实现接口的任何结构一起工作(这是接口no?的opoint,以避免定义确切的类型
)我投了你一票,因为这是一个很好的案例研究:)请看我的编辑,它解决了你的问题。如果你不能更改方法签名,那么你就完蛋了。括号的使用允许你使用VB关键字作为标识符,就像微软风格的SQL和其他一些东西一样。我将代码改为使用source
而不是[object]
,因为它看起来更具描述性。出于兴趣的考虑,[object]
的C等价物将是@object
。