4

両方を実装する基本クラスと派生クラスを作成しようとしていますICloneableClone基本クラスのメソッドはすべての基本クラスのプロパティを処理し、派生クラスの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です。ここで何をすべきか知っている人はいますか?

ここで質問を見てきましたが、それをVB.Netに変換できません。ここに記載されている解決策が必要な場合は、そのアイデアをあきらめます。時間がたてば、 base class を作成する予定MustInheritです。

4

1 に答える 1

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
于 2014-10-30T14:53:33.397 に答える