Я пытаюсь создать базовый класс и производный класс, которые реализуют 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
, если это имеет значение.
Так как вы не хотите использовать одну из (нечистых) обходных путей, может быть, библиотека может помочь вам. AutoMapper может быть подходящим для ваших нужд (или любая другая библиотека сопоставления может также выполнить эту работу): http://www.codeproject.com/Articles/61629/AutoMapper – WeSt