C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: Classを入れ子にした時、上位クラスの変数を参照したい


(過去ログ 81 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■48097 / inTopicNo.1)  Classを入れ子にした時、上位クラスの変数を参照したい
  
□投稿者/ ペインタ (1回)-(2010/03/24(Wed) 12:46:48)

分類:[VB.NET/VB2005 以降] 

VB2008です。
以下のように、ParentClassの中にChildClassがあるクラスがあったとします。
Public Class ParentClass
Private Const TEST_MSG As String = "これはテストです"
Private iNum As Integer
Private sText As String
(以下略)



Private Class ChildClass
(以下略)



End Class
End Class

ここで入れ子になっている子クラスChildClass内のメソッドで、
親クラスParentClassのPrivate変数・定数(例えばTEST_MSGやiNum・sText)を参照したいのですが、
ParentClassのPrivate変数・定数は、ChildClass内はスコープ外なのでしょうか?
エラー一覧に、「非共有メンバを参照するにはオブジェクト参照が必要です」というメッセージが表示されます。
この辺をよく理解していないので、どなたか教えてもらえないでしょうか?
よろしくお願いいたします。
引用返信 編集キー/
■48098 / inTopicNo.2)  Re[1]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ Hongliang (579回)-(2010/03/24(Wed) 13:23:19)
Public Class Parent
  Public Sub New(value As Integer)
    Me.x = value
  End Sub
  Private x As Integer
  Private Shared sharedChild As New Child
  Private Class Child
    Public Function GetX() As Integer
      ' Parent の x を返す
    End Function
  End Class
End Class

という構成だと、
Dim a As New Parent(0)
Dim b As New Parent(1)
のとき sharedChild.GetX() はどちらの x を返せばいいのでしょう?
と考えると分かるとおり、Parent のメンバは静的(Shared/Const)でない限り Parent の参照が必要です。
Child のコンストラクタに Parent の参照(Me)を渡すことが多いでしょう。

Public Class Parent
  Public Sub New(value As Integer)
    Me.x = value
    Me.c = New Child(Me)
  End Sub
  Private x As Integer
  Private c As Child
  Private Shared ReadOnly y As Integer = 4

  Private Class Child
    Public Sub New(ByVal parent As Parent)
      Me.p = parent
    End Sub
    Private p As Parent
    Public Function GetX() As Integer
      Dim a As Integer = p.x  ' Private にもアクセス可能
      Dim b As Integer = Parent.y  ' Shared/Const メンバは当然ながらクラス名からアクセス
      Return a + b
    End Function
  End Class

  ' Shared As Child の場合も同様
  Private Shared sharedChild As Child
  Shared Sub New()
    Parent.sharedChild = New Child(New Parent(0))
  End Sub
End Class

引用返信 編集キー/
■48099 / inTopicNo.3)  Re[1]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ 魔界の仮面弁士 (1574回)-(2010/03/24(Wed) 13:28:53)
No48097 (ペインタ さん) に返信
> ここで入れ子になっている子クラスChildClass内のメソッドで、
ChildClass は、ParentClass の内部クラスにはなっていますが、
そのインスタンスは親子関係になっていない事に注意してください。

インスタンスを親子関係として管理している例としては、
フォームの .Controls プロパティなどがあります。


> 親クラスParentClassのPrivate変数・定数(例えばTEST_MSGやiNum・sText)を参照したいのですが、
下記のようにすることは可能です。

Public Class ParentClass
    Private Const TEST_MSG As String = "これはテストです"
    Private iNum As Integer = 123
    Private sText As String = "Sample"
    Private child As New ChildClass(Me)
    ' :
    ' 略
    ' :
    Private Class ChildClass
        Private parent As ParentClass
        Public Sub New(ByVal p As ParentClass)
            Me.parent = p
        End Sub
        Friend Sub FireTest()
            MsgBox(Me.parent.sText, vbInformation, ParentClass.TEST_MSG)
        End Sub
    End Class
End Class

引用返信 編集キー/
■48126 / inTopicNo.4)  Re[2]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ ペインタ (2回)-(2010/03/25(Thu) 12:38:36)
みなさま、ご回答ありがとうございました。
ParentClassクラスで定義している定数、

    Private Const TEST_MSG As String

については、ChildClass側でも参照できますね。
また、ParentClassクラスで定義している変数についても、
以下のように、Private Shared〜と定義すれば参照できる(ビルドエラーとならない)ようですが、
この使い方は問題ないでしょうか?

Public Class ParentClass
    Private Const TEST_MSG As String = "これはテストです"
    Private Shared iNum As Integer
    Private Shared sText As String
    (以下略)
    ・
    ・
    ・
    Private Class ChildClass
        (以下略)
        ・
        ・
        ・
    End Class
End Class

これら変数は、親のParentClassクラスのインスタンス生成時に、定数式では表現できない内容を格納します。
ParentClassクラスだけでなく、子のChildClassクラスでも参照したいので、この方法で問題なければ
このように対応したいと思います。

引用返信 編集キー/
■48128 / inTopicNo.5)  Re[3]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ よねKEN (449回)-(2010/03/25(Thu) 12:52:28)
> また、ParentClassクラスで定義している変数についても、
> 以下のように、Private Shared〜と定義すれば参照できる(ビルドエラーとならない)ようですが、
> この使い方は問題ないでしょうか?

問題ないかどうかは、ペインタさんがどうしたいのか次第です。
iNumやsTextは、ParentClassクラスで1つの値だけを保管するものなのか、
それともParentClassクラスのインスタンスごとに1つの値を保管するべきものなのか、
どちらでしょうか。

> これら変数は、親のParentClassクラスのインスタンス生成時に、定数式では表現できない内容を格納します。

ParentClassのインスタンスを生成するとのことですが、そのインスタンスごとにiNumやsTextは
異なる値を設定するのではないのでしょうか?

> ParentClassクラスだけでなく、子のChildClassクラスでも参照したいので、この方法で問題なければ
> このように対応したいと思います。

インスタンスごとに異なる値を設定するのであれば、問題があります。

インスタンスごとにiNumやsTextに異なる値を持つのであれば、
Hongliangさんや魔界の仮面弁士さんの回答をご覧ください。

引用返信 編集キー/
■48144 / inTopicNo.6)  Re[4]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ ペインタ (3回)-(2010/03/25(Thu) 18:58:52)
No48128 (よねKEN さん) に返信
よねKENさん、コメントありがとうございます。
SharedにするPrivate変数は、ParentClassが複数インスタンスを生成したとしても、
同じ値が入ります。
上記でも触れているとおり、定数的な使い方をしたいのですが、メソッドを含む式で表す値なので、
Constで定義できないため、この値を共有化したいと考えたのでした。
引用返信 編集キー/
■48145 / inTopicNo.7)  Re[5]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ 魔界の仮面弁士 (1579回)-(2010/03/25(Thu) 19:01:54)
No48144 (ペインタ さん) に返信
> 上記でも触れているとおり、定数的な使い方をしたいのですが、メソッドを含む式で表す値なので、
> Constで定義できないため、この値を共有化したいと考えたのでした。

『共有』するなら、文字通り『Shared』で良いと思います。
また、それが定数的なものであるならば、さらに ReadOnly なフィールドにしておいた方が良いかも。
引用返信 編集キー/
■48194 / inTopicNo.8)  Re[6]: Classを入れ子にした時、上位クラスの変数を参照したい
□投稿者/ ペインタ (4回)-(2010/03/26(Fri) 16:54:25)
No48145 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん、コメントありがとうございます。
このスレッドは解決済みとさせていただきます。
お世話になりました。今後ともよろしくお願いいたします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -