継承クラスのコンストラクタに基底クラスのインスタンスを渡す方法

タグの編集
投稿者 キムラ  (社会人) 投稿日時 2011/12/8 10:12:00
現在、継承について勉強中です。
さて、基底クラスAとこれを継承したクラスBがあったとします。
継承クラスBのインスタンスを作成する際に、基底クラスAのインスタンスを渡して、
継承クラスBのインスタンスからも基底クラスAのメンバにアクセスできればいいな
と思っているのですが、このようなことは可能でしょうか?
要は、継承クラスBのMyBaseの内容を基底クラスAのものに置き換えたいのです。
それとも、こういったことは継承では行ってはいけないのでしょうか?

Public Class classB
    Inherits classA

    Private TestID_ As Integer

    Public Sub New(ByVal TestID As Integer, ByVal clsA as classA)
        TestID_ = TestID
        'MyBaseにインスタンスclsAの内容を設定する方法が分かりません。
    End Sub

End Class
投稿者 shu  (社会人) 投稿日時 2011/12/8 11:15:36
Public Class A
    Protected a as integer


End Class


Public Class B
    Inherits A

    Private b as integer

   Public Sub New(Vala as Integer, Valb as Integer)
       Mybase.a = Vala
       b = Valb
   End Sub

End Class

こういうことですか?
投稿者 とくま  (社会人) 投稿日時 2011/12/8 12:20:58
継承はあくまで構造の引継ぎであり、
データを共有する事とは無関係です。

意味合い的には、同じクラス ClassA
のインスタンスを2つ
Dim ClassA1 As New ClassA
Dim ClassA2 As New ClassA
作って ClassA2 から ClassA1 を見れれば
便利?と言っているのに近いです。
継承とは関係ない話であり、構造的に無駄の
可能性も高いです。

普通、やりません。必要ありません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/12/8 12:53:28
いわゆる「コピーコンストラクタ」のようなものでしょうか?

> 要は、継承クラスBのMyBaseの内容を基底クラスAのものに置き換えたいのです。
各メンバーのコピーを、自分で個別に行っていく必要があります。
そのため、基底クラスの Private メンバーをコピー先の継承クラスに引き継がせることはできません。
(一応、リフレクションを利用して無理矢理コピーすることはできますが)
http://msdn.microsoft.com/ja-jp/library/ms173116%28vs.80%29.aspx

ゆえに、このような機能を実装するとしても、ICloneable インターフェイス等を
利用した方が良いでしょう。複雑な構造の場合は、永続化したデータを
受け渡すことで対処する手法もあります。
http://smdn.jp/programming/netfx/cloning/
投稿者 キムラ  (社会人) 投稿日時 2011/12/8 13:42:38
みなさま、ご回答ありがとうございました。
やはり、この場合は継承というのはおかしいですね。
最終的に、以下のようにしました。

Public Class classB

    Private TestID_ As Integer
    Private ClsA_ As classA

    Public Sub New(ByVal TestID As Integer, ByVal clsA as classA)
        TestID_ = TestID
        ClsA_ = clsA
    End Sub

    Public ReadOnly Property ClassA() as classA  'とりあえずReadOnly
            Get
                Return ClsA_
            End Get
    End Property
End Class

これでもクラスBからクラスAを参照できるので、この方法ですすめてみようと思います。
みなさまありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/12/8 16:35:09
> やはり、この場合は継承というのはおかしいですね。
「委譲」による実装ですかね。


> 最終的に、以下のようにしました。
classA を渡す場所がコンストラクタだけなのであれば、
ClsA_ も ReadOnly で良いかも。


> Public ReadOnly Property ClassA() as classA  'とりあえずReadOnly
ReadOnly にすることで、たとえば外部(classC など)から、
 objB.ClassA = New classA()
などとして差し替えられてしまう事は防げますが、
 objB.ClassA.WritablePropertyX = "New Value"
のような操作を禁止できるわけではない点にご注意を。