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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.62504 の関連記事表示

<< 0 >>
■62504  自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる -(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()ということも考えましたが、継承というのとは少し違う気もして、
    「親メソッド」「インスタンスを保持しているオブジェクト」などの検索ワードで調べても、思ったような情報がなく、ここで質問させていただきました。
親記事 /過去ログ105より / 関連記事表示
削除チェック/

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

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

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

    提示された例ならTest2のNewでTest1のMethodを実行する意味がないのでTest1のNewに書けばいいのでは?
    例がよくないのでいまひとつ目的がつかめないです。
記事No.62504 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62509  Re[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
    
    またしてもかなり無意味な例でごめんなさい;
記事No.62504 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62510  Re[3]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ shu -(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))
    ここで 『インスタンスから呼ばれたいメソッド』を呼べばいいのでは?

記事No.62504 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62511  Re[4]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる -(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

    話の流れからするに、こうした方法は一般的ではないのでしょうか…?
記事No.62504 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62512  Re[5]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ぐっさん -(2011/10/16(Sun) 05:24:22)
    2011/10/16(Sun) 05:52:52 編集(投稿者)

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

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

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

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

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

    あと、子側で親インスタンスを取得したい理由は何でしょうか?
    今回の例の親クラスと子クラスとの役割が分かりませんので何とも言えませんが、
    親側のメソッドを呼び出すためだけに子側で親インスタンスを取得するのは、本当に正しい設計なのかどうか疑問を感じます。
    (親インスタンスのプロパティを参照したいので子側で親インスタンスを取得したいというのであれば理解できますが。)
記事No.62504 のレス /過去ログ105より / 関連記事表示
削除チェック/

■62513  Re[6]: 自分のインスタンスを保持しているオブジェクトを取得
□投稿者/ ひらまる -(2011/10/16(Sun) 06:04:14)
    No62512 (ぐっさん さん) に返信

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

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

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

    わけのわからない質問に丁寧に回答して下さってありがとうございました。
    今後とも勉強に励んで参りたいと思います。
記事No.62504 のレス / END /過去ログ105より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -