- ベストアンサー
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つが知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
コンストラクタは普通のメソッドと異なり、継承先で暗黙的に利用できるようになりません。 要するに、基底クラスで特殊なコンストラクタ(「デフォルトコンストラクタ(引数無しのコンストラクタ)」以外)を定義しているなら、派生クラスでもそれを明示的に書く必要がある、ということです。
その他の回答 (1)
- KG_
- ベストアンサー率62% (34/54)
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にコンストラクタを記述するしかないと思います。
お礼
>と引数なしで初期化しているからではないでしょうか? >Private _Member1 As New TEST1("aaa","bbb") >Private _Member2 As New TEST1("ccc","ddd") もちろん、これは試しました。 が、ダメでした。
お礼
>パラメータ付きのコンクラスタを持つ基本クラスの呼び出しは、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("", "") という初期化は、全てのプライベート変数を親から子へ引き継ぐということでしょうか? そのような現象が確認されました。 厚かましい追加質問ですが、よかったら教えてください。