- PR -

メソッドの呼出元インスタンスの取得方法がわかりません

投稿者投稿内容
ロニー
会議室デビュー日: 2006/04/26
投稿数: 3
投稿日時: 2006-04-27 13:59
はじめまして。
いつも勉強させて頂いております。

今、メソッドの呼出元クラスのインスタンスを取得する方法がわからなくて
困っています。
以下が実装の概要です。

MainForm(大元のForm)-----------------------------------
button1_Click(object sender, System.EventArgs e){
Form a = new Form();
a.Show();
}
//ボタンを押すとForm aを開きます
---------------------------------------------------------

Form a(大元のボタンを押すごとに開かれるForm)----------------------
public void test(){
TestClass tc = new TestClass();
tc.TestClassMethod();
}
//Form aが開かれると呼ばれる、別のクラスのメソッドを呼ぶメソッドです。
---------------------------------------------------------------------

TestClass(開かれたForm aから呼ばれるメソッド)-----------
public void TestClassMethod(){
//処理
}
//このメソッドの呼出元を判別したい
----------------------------------------------------------


メソッドの呼出元のクラス名は取得できるのですが、複数Formがあった場合、
どの呼出元もクラス名は「Form」となってしまい、物理的にどのFormインスタンスから
呼ばれたのかがわかりません。
インスタンス名も全て「a」なので同様です。

現在、引数に呼出元自身を渡す方法を取れないので、それ以外でなんとか
呼出元インスタンスを取得する方法がありましたら、ご教授ください。
よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-27 14:03
引用:

ロニーさんの書き込み (2006-04-27 13:59) より:

//このメソッドの呼出元を判別したい


インスタンスを渡します。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-27 14:13
引用:

現在、引数に呼出元自身を渡す方法を取れないので、それ以外でなんとか
呼出元インスタンスを取得する方法がありましたら、ご教授ください。


何故なのでしょうか?普通はそうしますが…。
引数に渡さないのに呼び出し元を判断したいというのはどういう理由でしょうか?場合によっては別の解決策が見つかるかもしれません。
_________________
囚人のジレンマな日々
ロニー
会議室デビュー日: 2006/04/26
投稿数: 3
投稿日時: 2006-04-27 14:29
理由というのは、残念ながら技術的な話ではなく、既に呼出元インスタンスを
引数で渡さない形で仕様が確定しているためです。
後からの追加でこの呼出元の判別が必要となったため、現仕様を変更できないのです・・・。

もちろん引数で渡すことが最善の方法だとは思っているのですが、
どうにかしてそれ以外の方法で回避できないかと思い投稿させて頂きました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-27 14:40
引数に渡すのが無理なのであれば、別のどこかに参照を入れておくルールなりにしないと、
結局のところ、同じ型のインスタンスの場合判別ができなくなります...

何のために渡すのかをお聞かせ願えると、別の回避方法が見つかるかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-04-27 15:32
引用:

後からの追加でこの呼出元の判別が必要


よって
引用:

引数で渡さない形で仕様が確定


を変更せねばならない。
と、説得するべきでしょう。

変更が入ったら変更する箇所が発生するのは自然であり(現にメソッド内のロジックを変更しようとしている)、変更が必要な箇所を「確定のまま」にしておくのが変です。
_________________
囚人のジレンマな日々
むら
会議室デビュー日: 2006/04/11
投稿数: 11
お住まい・勤務地: さっぽろ
投稿日時: 2006-04-27 16:10
引用:

引数で渡さない形で仕様が確定



という仕様を作る意味がそもそもわかりません。
引数で渡たすことで、何かデメリットがあるのでしょうか
また引数で渡さないことで何かメリットがあるのでしょうか

何もないような・・。

引用:

を変更せねばならない。
と、説得するべきでしょう。



すばらしい洞察
ロニー
会議室デビュー日: 2006/04/26
投稿数: 3
投稿日時: 2006-04-27 17:34
みなさまのご指摘の通り、現仕様を変更するのが最善の方法だと思います。
ですが、この修正により発生するコストを考慮すると、そう安易に諦めて
仕様変更とするわけにはいかないのです。
技術的に回避不可能、と証明されればやむを得ないのですが、限界まで現状での
回避方法を検討するのも技術屋の仕事の一つだと思っております。
(ここで質問している私が技術屋などと言うのはおこがましいですが・・・)

なお、「引数で渡さない形で仕様が確定」となったのは、そもそも当初の設計時は
呼出元インスタンスを渡すことが必要となるような機能が存在しなかったからです。
元々わかっていたのであれば、こんな仕様で確定させることはありません。
よって、何かメリットデメリットがあってのことではありません。


実際なぜこんなことが必要なのかというと前述のサンプルで言うところの
Form aは同じクラス名、インスタンス名で複数のインスタンスが作られますが、
内部で保持している値がそれぞれ違うのです。
呼出先のメソッドでは、その値を利用して行う処理を変える、という機能になります。
なので、呼出先でFormインスタンスを一意に特定して取得し、そのインスタンスの
持つ値を取得する必要があります。

みなさまのご指摘が正論とわかってはおりますが、ご教授頂ければ幸いです。

スキルアップ/キャリアアップ(JOB@IT)