Как сделать производный класс клонируемым?

Я пытаюсь создать базовый класс и производный класс, которые оба реализуют 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, Кто-нибудь знает, что здесь делать?

Я посмотрел на вопрос здесь, но не могу перевести его на VB.Net. Если приведенное здесь решение необходимо, я откажусь от этой идеи. В нужный момент планирую сделать базовый класс MustInherit, если это имеет какое-либо значение.

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
Другие вопросы по тегам