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