【问题标题】:How do I make a derived class cloneable?如何使派生类可克隆?
【发布时间】:2014-10-30 14:27:00
【问题描述】:

我正在尝试创建一个基类和一个派生类,它们都实现了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

这导致第 (1) 行出现运行时异常 Unable to cast object of type MyBaseClass to type MySubClass,我承认这并不让我感到惊讶。将该行替换为

    Dim new_sub_class As MySubClass = MyBase.Clone

产生了编译错误。在我看来,我需要某种将MyBaseClass 转换为MySubClass 的方法,以便使用基类的Clone 设置基类的成员。一个不太吸引人的替代方法是将基类的成员复制到子类的Clone 中。有谁知道在这里做什么?

我查看了here 的问题,但无法将其翻译成 VB.Net。如果here 给出的解决方案是必要的,那么我将放弃这个想法。如果有什么不同的话,我计划在充足的时间制作基类MustInherit

【问题讨论】:

  • 由于您不想使用其中一种(不干净的)解决方法,也许图书馆可能会帮助您。 AutoMapper 可能适合您的需求(或任何其他映射库也可以完成这项工作):codeproject.com/Articles/61629/AutoMapper

标签: vb.net inheritance icloneable


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2010-11-23
    • 2016-07-11
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多