トップ回答者
C# クラスからクラスの呼出しについて

質問
-
下記のようにpublic void AAAから共通クラス public string BBBのメソッド1を呼出すことは可能ですが、
共通クラス public string CCC()からpublic string BBBの{メソッド1}を呼ぶのはどうやればいいのでしょうか?
説明が下手ですみません。
public Form1()
public void AAA()
{メソッド1}
-------------------------------------------------------
共通クラス()
public string BBB()
{メソッド1}
public string CCC()
{メソッド1}
回答
-
原則として、次のすべての条件を満たす場合のみ、呼び出すことができます。
- 存在している
- 知られている
「存在している」とは、static で修飾されていない場合は、インスタンスが必要です。
「知られている」とは、クラスやメソッドのアクセス修飾子によって、アクセスしたい場所からアクセス可能なように設定されていることです。下記のようにpublic void AAAから共通クラス public string BBBのメソッド1を呼出すことは可能ですが、
「下記」の中で、AAA から「共通クラス public string BBBのメソッド1」を呼び出していないので、どのように呼び出すのか、わかりませんでした。
上に書いた原則を守るようにするには、どうすればいいか考えてください。
ところで、これは、どういう意味なのでしょうか。
public Form1() public void AAA() {メソッド1} 共通クラス public string BBB() {メソッド1}
これは、コンパイルできないですよね?また、質問文からは、「メソッド1」がメソッドのようですが、メソッドの中にメソッドが定義されているのでしょうか?C# では、そんなことはできないはずです。説明が下手だと思うなら、いきなりネットワークの向こうにいる見ず知らずの人間に相談するのではなく、まずは隣の人に相談しましょう。これは、隣の人が疑問を解決できるかどうか、関係ありません。隣の人が、質問を理解できるかどうか、が大事です。隣の人に理解できない質問を、ネットワークの向こうの人が理解できるとは思えませんが、どうでしょう?
Jitta@わんくま同盟
- 回答の候補に設定 ひらぽんModerator 2013年6月28日 2:49
- 回答としてマーク 星 睦美 2013年7月4日 4:49
すべての返信
-
「C# メソッド」辺りのキーワードでググれば出てくるメソッド (C# プログラミング ガイド)は読まれたのでしょうか?
-
ひらぽん様
おっしゃるとおりです。
共通クラスないで自分自身を呼出したいのです。
public class 共通クラス
{
共通クラス Cls_a = new 共通クラス();public void Empty_Get(string sTarget_V, int iTarget_ren ,ref string Rtn_V)
{処理1}public int aaa()
{Cls_a.Empty_Get(Office_Rtn, 22, ref Rtn_V);}
}
別スレッドで trapemiyaさんがすでに回答されてますが、明らかに再帰的に呼び出してます。佐祐理さんの仰るとおりに設計が間違ってるように思われますね。なぜクラス内で、自身のインスタンスをメンバに持つ必要があるのでしょうか?そこが疑問です。
#シングルトンしたいわけでもなさそうだし・・・
ひらぽん http://d.hatena.ne.jp/hilapon/
- 編集済み ひらぽんModerator 2013年6月27日 9:33 言葉が足りなかったので若干修正
-
原則として、次のすべての条件を満たす場合のみ、呼び出すことができます。
- 存在している
- 知られている
「存在している」とは、static で修飾されていない場合は、インスタンスが必要です。
「知られている」とは、クラスやメソッドのアクセス修飾子によって、アクセスしたい場所からアクセス可能なように設定されていることです。下記のようにpublic void AAAから共通クラス public string BBBのメソッド1を呼出すことは可能ですが、
「下記」の中で、AAA から「共通クラス public string BBBのメソッド1」を呼び出していないので、どのように呼び出すのか、わかりませんでした。
上に書いた原則を守るようにするには、どうすればいいか考えてください。
ところで、これは、どういう意味なのでしょうか。
public Form1() public void AAA() {メソッド1} 共通クラス public string BBB() {メソッド1}
これは、コンパイルできないですよね?また、質問文からは、「メソッド1」がメソッドのようですが、メソッドの中にメソッドが定義されているのでしょうか?C# では、そんなことはできないはずです。説明が下手だと思うなら、いきなりネットワークの向こうにいる見ず知らずの人間に相談するのではなく、まずは隣の人に相談しましょう。これは、隣の人が疑問を解決できるかどうか、関係ありません。隣の人が、質問を理解できるかどうか、が大事です。隣の人に理解できない質問を、ネットワークの向こうの人が理解できるとは思えませんが、どうでしょう?
Jitta@わんくま同盟
- 回答の候補に設定 ひらぽんModerator 2013年6月28日 2:49
- 回答としてマーク 星 睦美 2013年7月4日 4:49
-
書きためておいたのを、追加の投稿をよく見ずに投稿したのですが...
public class 共通クラス { 共通クラス Cls_a = new 共通クラス(); public void Empty_Get(string sTarget_V, int iTarget_ren ,ref string Rtn_V) { 処理1 } public int aaa() { Cls_a.Empty_Get(Office_Rtn, 22, ref Rtn_V); } }
“全角”文字が使われていたりしますが、これが、本当にしたかったことなのですか?
先に、「存在している」「知られている」と書きました。共通クラスに定義されている aaa メソッドから、共通クラスに定義されている Empty_Get メソッドを呼び出すことを考えます。
aaa メソッドも Empty_Get メソッドも、共に同じ「共通クラス」に定義されています。
よって、Empty_Get メソッドは、aaa メソッドに「知られている」と判断できます。aaa メソッドは、インスタンスに属するように定義されています。また、Empty_Get メソッドも、インスタンスに属するように定義されています。
共にインスタンス メソッドなので、aaa メソッドが存在してるときに Empty_Get メソッドも「存在している」ことになります。で、問題は、「どのインスタンスにあるものを呼び出すか」ということなのでしょうか。インスタンス メソッドなので、メンバーはインスタンスで修飾します。同じインスタンスは、「this」で表すことができます。よって、aaa メソッドから Empty_Get メソッドの呼び出しは、次のようになります。
public class 共通クラス { // 同じクラスなので、いらない // 共通クラス Cls_a = new 共通クラス(); public void Empty_Get(string sTarget_V, int iTarget_ren ,ref string Rtn_V) { 処理1 } public int aaa() { this.Empty_Get(Office_Rtn, 22, ref Rtn_V); // 同じところにあるので、インスタンスは"this" // Cls_a.Empty_Get(Office_Rtn, 22, ref Rtn_V); } }
もし、「共通クラスのインスタンス AAA から、インスタンス BBB に影響を及ぼしたい」ということなら、次のようになります。
public class 共通クラス { public void Empty_Get(string sTarget_V, int iTarget_ren ,ref string Rtn_V) { 処理1 } // 外部からインスタンス BBB を供給してもらう public int aaa(共通クラス other) { // インスタンス BBB で実行する。 // クラス メンバーの内容は BBB の内容が参照される。 // 引数 Office_Rtn, RtnV は、AAA の内容が引き渡される。 other.Empty_Get(Office_Rtn, 22, ref Rtn_V); } }
もし、「どのインスタンスからも、Empty_Get メソッドでは同じ値を参照したい」ということなら、Empty_Get メソッドをクラス メソッドに変更し、次のように呼び出します。
public class 共通クラス { // static で修飾して、静的メソッドにする public static void Empty_Get(string sTarget_V, int iTarget_ren ,ref string Rtn_V) { 処理1 } public int aaa() { // 静的メソッドは、クラス名で修飾して呼び出す 共通クラス.Empty_Get(Office_Rtn, 22, ref Rtn_V); } }
さて、3つのパターンを考えてみましたが、あなたがしたいことは、この3つのパターンの中にあるでしょうか。もし、この中にないなら、どのように使いたいのか、詳しく書いてください。
ところで、第3引数は、なぜ ref なのでしょうか。ref の意味を理解して使用されていますか?
Jitta@わんくま同盟