dポイントプレゼントキャンペーン実施中!

' ==================================================================
' クラス 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つが知りたいです。

A 回答 (2件)

コンストラクタは普通のメソッドと異なり、継承先で暗黙的に利用できるようになりません。


要するに、基底クラスで特殊なコンストラクタ(「デフォルトコンストラクタ(引数無しのコンストラクタ)」以外)を定義しているなら、派生クラスでもそれを明示的に書く必要がある、ということです。
    • good
    • 0
この回答へのお礼

>パラメータ付きのコンクラスタを持つ基本クラスの呼び出しは、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("", "")

という初期化は、全てのプライベート変数を親から子へ引き継ぐということでしょうか?
そのような現象が確認されました。

厚かましい追加質問ですが、よかったら教えてください。

お礼日時:2009/03/27 13:29

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にコンストラクタを記述するしかないと思います。
    • good
    • 0
この回答へのお礼

>と引数なしで初期化しているからではないでしょうか?

>Private _Member1 As New TEST1("aaa","bbb")
>Private _Member2 As New TEST1("ccc","ddd")

もちろん、これは試しました。
が、ダメでした。

お礼日時:2009/03/27 12:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!