.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
Havin
Public Sub CopyFrom(MyUser作为ICopiable)实现了ICopiable。CopyFrom
也返回了同样的错误。你击败了我:)是的,我也觉得解决方案将通过泛型实现。。例如,接口和实现它的结构中的
子CopyFrom(Of T)(ByVal MyObject As Object)
。您的解决方案不适用于我,因为我有一些函数将
ICopiable
作为参数,并且我希望它与实现接口的任何结构一起工作(这是接口no?的opoint,以避免定义确切的
类型
)我投了你一票,因为这是一个很好的案例研究:)请看我的编辑,它解决了你的问题。如果你不能更改方法签名,那么你就完蛋了。括号的使用允许你使用VB关键字作为标识符,就像微软风格的SQL和其他一些东西一样。我将代码改为使用
source
而不是
[object]
,因为它看起来更具描述性。出于兴趣的考虑,
[object]
的C等价物将是
@object