2014-10-30 3 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

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^