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

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

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

Re[6]: 自分のインスタンスを保持しているオブジェクトを取得


(過去ログ 105 を表示中)

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

■62504 / inTopicNo.1)  自分のインスタンスを保持しているオブジェクトを取得
  
□投稿者/ ひらまる (1回)-(2011/10/15(Sat) 17:59:39)

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

VB.netにおいて、自分をインスタンスとして保持しているモジュール、クラス、インスタンスを知る方法はないでしょうか。
よく「このクラスのインスタンスを保持しているオブジェクトを返す」のようなメソッドがあるので、同じような機能を作りたいです。

Public Class Test1
   Public Sub New()
      Dim TestOBj = new Test2
   End Sub
   Public Sub Method()
       msgbox("テスト1のメソッドが呼ばれました")
   End Sub
End Class

Public Class Test2
   Public Sub New()
      '以下のようなことがやりたい。
      Parent.Method()
   End Sub
End Class

コンストラクタに Public Sub New( ByVal _parent As Object ) という方法もありますが、スマートではないと思いました。
Inherits Test1 で継承して、MyBase.Method()ということも考えましたが、継承というのとは少し違う気もして、
「親メソッド」「インスタンスを保持しているオブジェクト」などの検索ワードで調べても、思ったような情報がなく、ここで質問させていただきました。

引用返信 編集キー/
■62508 / inTopicNo.2)  Re[1]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ shu (1042回)-(2011/10/15(Sat) 20:02:32)
No62504 (ひらまる さん) に返信

無理だと思います。
Test1のオブジェクトの情報を渡さず、Test2からTest1の情報にアクセスできてしまっては
クラスとして分かれている意味がないです。

StackFrameを使用すればメソッドの呼ばれた順番は取得できますが、型情報は取得できてもオブジェクトとしては
取得できないでしょう。

提示された例ならTest2のNewでTest1のMethodを実行する意味がないのでTest1のNewに書けばいいのでは?
例がよくないのでいまひとつ目的がつかめないです。
引用返信 編集キー/
■62509 / inTopicNo.3)  Re[2]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる (2回)-(2011/10/15(Sat) 21:11:06)
No62508 (shu さん) に返信

回答ありがとうございます。
Newをしたときに自動的に、Newを実行したオブジェクトの情報が生成されたオブジェクトに渡されることはない。ということでしょうか。
となると以下のように、コンストラクタにMeを渡すという方法が一般的なのでしょうか?

Public Class 管理クラス
    Private 管理オブジェクトリスト As New List(Of 被管理クラス)
    Private プライベートな変数 As Integer = 0
    Public Sub New()
        For i = 0 To 10
            'いちいちMeを引数として渡すのは違和感がある(?)
            管理オブジェクトリスト.Add(New 被管理クラス(i, Me))
        Next
    End Sub
    Public Sub インスタンスから呼ばれたいメソッド(ByVal _管理番号 As Integer)
        MsgBox("" & _管理番号 & "番目のオブジェクトから呼び出されました。")
    End Sub
End Class

Public Class 被管理クラス
    Private 管理番号 As Integer
    Private 管理者インスタンス As 管理クラス
    Public Sub New(ByVal _管理番号 As Integer, ByVal _管理者インスタンス As 管理クラス)
        管理番号 = _管理番号
        '引数無しで呼び出せたら嬉しい。
        管理者インスタンス = _管理者インスタンス
        管理者インスタンス.インスタンスから呼ばれたいメソッド(管理番号)
    End Sub
End Class

またしてもかなり無意味な例でごめんなさい;

引用返信 編集キー/
■62510 / inTopicNo.4)  Re[3]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ shu (1043回)-(2011/10/15(Sat) 21:55:41)
No62509 (ひらまる さん) に返信

> Public Class 管理クラス
> Private 管理オブジェクトリスト As New List(Of 被管理クラス)
> Private プライベートな変数 As Integer = 0
> Public Sub New()
> For i = 0 To 10
> 'いちいちMeを引数として渡すのは違和感がある(?)
> 管理オブジェクトリスト.Add(New 被管理クラス(i, Me))
ここで 『インスタンスから呼ばれたいメソッド』を呼べばいいのでは?


引用返信 編集キー/
■62511 / inTopicNo.5)  Re[4]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる (3回)-(2011/10/15(Sat) 23:41:36)
No62510 (shu さん) に返信
すみません; やはり例えが悪すぎて伝わりづらかったですね;

上の例では便宜上Newの中でインスタンスから呼ばれたいメソッドを呼んでいますが、
実際にはこれは以下のようにコンストラクタではないメソッドで動的に呼び出されます。

Public Class 被管理クラス
Private 管理番号 As Integer
Private 管理者インスタンス As 管理クラス
Public Sub New(ByVal _管理番号 As Integer, ByVal _管理者インスタンス As 管理クラス)
管理番号 = _管理番号
'引数無しで呼び出せたら嬉しい。
管理者インスタンス = _管理者インスタンス
End Sub
'↓このメソッドはユーザーの操作に応じて動的に呼ばれる。
Public Sub 親メソッド呼び出し()
管理者インスタンス.インスタンスから呼ばれたいメソッド(管理番号)
End Sub
End Class

話の流れからするに、こうした方法は一般的ではないのでしょうか…?
引用返信 編集キー/
■62512 / inTopicNo.6)  Re[5]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ぐっさん (13回)-(2011/10/16(Sun) 05:24:22)
2011/10/16(Sun) 05:52:52 編集(投稿者)

No62504 (ひらまる さん) に返信

> よく「このクラスのインスタンスを保持しているオブジェクトを返す」のようなメソッドがあるので、

これは、例えば何のクラスの何のメソッドでしょうか?

また、子(被管理)クラスのコンストラクタに親(管理)クラスを渡したくない理由は何でしょうか?
親クラスのインスタンスが唯一なのであれば、親クラスの全メンバをSharedにするとか、
親クラスのインスタンスをPublicなスコープにして子クラスから参照可能にする、といった方法が考えられますが、
これではコード上、親子関係が分かりにくくなるような気がします。

他には、子側にイベントを用意して、親ではそのイベントハンドラで親側処理を実行する、という手もありますが、
わざわざこんなことまでしなくとも、子のインスタンスを作成するときに親インスタンスを渡す方が簡単だと思うのですが。

あと、子側で親インスタンスを取得したい理由は何でしょうか?
今回の例の親クラスと子クラスとの役割が分かりませんので何とも言えませんが、
親側のメソッドを呼び出すためだけに子側で親インスタンスを取得するのは、本当に正しい設計なのかどうか疑問を感じます。
(親インスタンスのプロパティを参照したいので子側で親インスタンスを取得したいというのであれば理解できますが。)
引用返信 編集キー/
■62513 / inTopicNo.7)  Re[6]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる (4回)-(2011/10/16(Sun) 06:04:14)
No62512 (ぐっさん さん) に返信

>これは、例えば何のクラスの何のメソッドでしょうか?
これは勘違いだったみたいです……
System.Data.DataTableにParentRelationsというプロパティがあり、
「この DataTable の親リレーションシップのコレクションを取得します。」と書いてありましたが、
親のインスタンスを返すとはどこにも書いてありませんでした;

標準で親のインスタンスを知る機能がないのならば、上記の例のように親のインスタンスをMeで渡そうと思います。

どうしても、「オブジェクト指向ってすごく便利だから親のインスタンスを知る機能くらいあるに違いない!」
「自分の調べ方が悪いに違いない!」「聞き方が悪いに違いない!」と意地になっていました…申し訳ありません;

わけのわからない質問に丁寧に回答して下さってありがとうございました。
今後とも勉強に励んで参りたいと思います。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -