継承クラスのコンストラクタに基底クラスのインスタンスを渡す方法
投稿者 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
こういうことですか?
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 を見れれば
便利?と言っているのに近いです。
継承とは関係ない話であり、構造的に無駄の
可能性も高いです。
普通、やりません。必要ありません。
データを共有する事とは無関係です。
意味合い的には、同じクラス 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/
> 要は、継承クラス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を参照できるので、この方法ですすめてみようと思います。
みなさまありがとうございました。
やはり、この場合は継承というのはおかしいですね。
最終的に、以下のようにしました。
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"
のような操作を禁止できるわけではない点にご注意を。
「委譲」による実装ですかね。
> 最終的に、以下のようにしました。
classA を渡す場所がコンストラクタだけなのであれば、
ClsA_ も ReadOnly で良いかも。
> Public ReadOnly Property ClassA() as classA 'とりあえずReadOnly
ReadOnly にすることで、たとえば外部(classC など)から、
objB.ClassA = New classA()
などとして差し替えられてしまう事は防げますが、
objB.ClassA.WritablePropertyX = "New Value"
のような操作を禁止できるわけではない点にご注意を。
さて、基底クラス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