• ベストアンサー

VB2008: 継承の場合のコンストラクタの書き方?

' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _Member1 As String   Private _Member2 As String   ' //   ' // パラメータを持つ初期化   ' //   Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String)     _Member1 = aMember1     _Member2 = aMember2   End Sub End Class ' =========================== ' クラス TEST1 の派生クラス ' =========================== <Serializable()> Public Class NEWTEST1 Inherits TEST1 Private _Member1 As New TEST1 Private _Member2 As New TEST1 End Class これでもOKかと思うのですが・・・。 パラメータ化されていないコンストラクタをクラス TEST1 に書くように促すエラーがでます。 もちろん、パラメータを持たないコンストラクタを用意すればエラーは回避できます。 問題は、「Visual Basic のプログラミングガイド」からその理由を読み取れないことです。 >Visual Basic のオブジェクトの概要 >クラスについて >オブジェクトの作成と使用 まだ、ここしか読んでいません。 が、どうにも気になったので質問します。 1、エラーの回避策としては何が正しいのか? 2、その根拠は? この2つが知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#259269
noname#259269
回答No.2

コンストラクタは普通のメソッドと異なり、継承先で暗黙的に利用できるようになりません。 要するに、基底クラスで特殊なコンストラクタ(「デフォルトコンストラクタ(引数無しのコンストラクタ)」以外)を定義しているなら、派生クラスでもそれを明示的に書く必要がある、ということです。

noname#140971
質問者

お礼

>パラメータ付きのコンクラスタを持つ基本クラスの呼び出しは、MyBase(XXX)のようになります。 多分、この1行の意味が理解出来ていなかったのだと思います。 >派生クラスでもそれを明示的に書く必要がある! で、書いてみました。 ' =========================== ' クラス TEST1 の派生クラス ' =========================== <Serializable()> Public Class NEWTEST1   Inherits TEST1   'Private _MemberCount As New TEST1   'Private _Member1 As New TEST1   'Private _Member2 As New TEST1   Private _isByteLength As Boolean = True   ・・・・・   Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String)     MyBase.New("", "")     Me.Member1 = aMember1     Me.Member2 = aMember2   End Sub End Class ' ======================== ' クラス; オーバーライド ' ======================== Module theOverride   Sub Main()     Dim NT1 As New NEWTEST1("taro", "太郎")     Debug.Print(NT1.MembersNameLength.ToString)     NT1.isByteLength = False     Debug.Print(NT1.MembersNameLength.ToString)   End Sub End Module [イミディエイト ウインドウ] 6 8 目出度く成功しました。 <追加質問> MyBase.New("", "") という初期化は、全てのプライベート変数を親から子へ引き継ぐということでしょうか? そのような現象が確認されました。 厚かましい追加質問ですが、よかったら教えてください。

その他の回答 (1)

  • KG_
  • ベストアンサー率62% (34/54)
回答No.1

TEST1のコンストラクタでは、 >Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String) としているのに TEST2では >Private _Member1 As New TEST1 >Private _Member2 As New TEST1 と引数なしで初期化しているからではないでしょうか? Private _Member1 As New TEST1("aaa","bbb") Private _Member2 As New TEST1("ccc","ddd") 1、エラーの回避策としては何が正しいのか?   引数なしで初期化したいのであれば、引数なしのコンストラクタを用意するしかないと思います。 2、その根拠は?   引数なしで初期化したいのであれば、そうするしかないと思います。 もしも引数なし、引数有り両方対応したいということであれば、Overridesで両方TEST1にコンストラクタを記述するしかないと思います。

noname#140971
質問者

お礼

>と引数なしで初期化しているからではないでしょうか? >Private _Member1 As New TEST1("aaa","bbb") >Private _Member2 As New TEST1("ccc","ddd") もちろん、これは試しました。 が、ダメでした。

関連するQ&A