2014-10-30 24 views
4

我正在嘗試創建一個基類和派生類,它們都實現了ICloneable。在我看來,基類Clone方法應該照顧所有基類屬性和派生類Clone方法的所有派生類屬性,並使用基類的Clone方法。其結果是這樣的: -如何使派生類可複製?

Public Class MyBaseClass 
    Implements ICloneable 

    Private my_base_var As Integer 

    Public Function Clone() As Object Implements System.ICloneable.Clone 
     Dim new_base_class As MyBaseClass = New MyBaseClass 
     new_base_class.my_base_var = my_base_var 
     Return new_base_class 
    End Function 

End Class 

Public Class MySubClass 
    Inherits MyBaseClass 
    Implements ICloneable 

    Private my_sub_var As Integer 

    Public Overloads Function Clone() As Object Implements System.ICloneable.Clone 
     Dim new_sub_class As MySubClass = CType(MyBase.Clone, MySubClass) ' (1) 
     new_sub_class.my_sub_var = Me.my_sub_var 
     Return new_sub_class 
    End Function 

End Class 

這導致運行時異常Unable to cast object of type MyBaseClass to type MySubClass在線路(1),我承認並沒有讓我感到吃驚。用

替換該行
Dim new_sub_class As MySubClass = MyBase.Clone 

產生編譯錯誤。在我看來,我需要某種方式將MyBaseClass轉換爲MySubClass,以便讓基類的成員設置基類的Clone。一個不太吸引人的選擇是複製基類的成員在子類的Clone中。有誰知道在這裏做什麼?

我已經看過here這個問題,但不能將它翻譯成VB.Net。如果解決方案here是必要的,那麼我會放棄這個想法。在時間充裕的情況下,我打算使基類MustInherit,如果這有什麼區別。

+0

既然你不想使用(污)解決方法之一,也許庫可以幫助你。 AutoMapper可能適合您的需求(或任何其他映射庫也可以完成這項工作):http://www.codeproject.com/Articles/61629/AutoMapper – WeSt 2014-10-30 14:38:18

回答

2

一個可能的實現看起來是這樣的:

Public Class MyBaseClass 
    Implements ICloneable 
    Private my_base_var As Integer = 1 

    Public Overridable Function Clone() As Object implements ICloneable.Clone 
     Dim theClone = Create() 
     theClone.my_base_var = my_base_var 
     Return theClone 
    End Function 

    Protected Overridable Function Create() As MyBaseClass 
     Return New MyBaseClass() 
    End Function 
End Class 

Public Class MySubClass 
    Inherits MyBaseClass 
    Private my_sub_var As Integer = 1 

    Public Overrides Function Clone() As Object 
     Dim theClone = DirectCast(MyBase.Clone(), MySubClass) 
     theClone.my_sub_var = Me.my_sub_var 
     Return theClone 
    End Function 

    Protected Overrides Function Create() As MyBaseClass 
     Return New MySubClass() 
    End Function 
End Class 
相關問題