How to make a derived class cloned?

I am trying to create a base class and a derived class that implement ICloneable. It seems to me that the method of the base class Cloneshould take care of all the properties of the base class and the method of the derived class Clonefor all the properties of the derived class and use the method of the base class Clone. The result looks something like this: -

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

This results in a run-time exception Unable to cast object of type MyBaseClass to type MySubClasson line (1), which I admit did not surprise me. Replacing this line with

    Dim new_sub_class As MySubClass = MyBase.Clone

. , - MyBaseClass MySubClass, , Clone. Clone. - , ?

, VB.Net. , . MustInherit, .

+4
1

:

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
+2

All Articles