none
C# クラスからクラスの呼出しについて RRS feed

  • 質問

  • 下記のように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}

    2013年6月26日 11:46

回答

  •  原則として、次のすべての条件を満たす場合のみ、呼び出すことができます。

    • 存在している
    • 知られている

     「存在している」とは、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@わんくま同盟

    2013年6月27日 13:56

すべての返信

  • 「C# メソッド」辺りのキーワードでググれば出てくるメソッド (C# プログラミング ガイド)は読まれたのでしょうか?
    2013年6月26日 12:57
  • どのようなことを質問されているのかよくわかりませんでした。
    そもそも各メソッドであるAAA, BBB, CCC内にあるメソッド1とは何でしょうか?
    C#の文法に沿っている、もう少し具体的なコードを書いていただくと助かります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年6月26日 13:23
    モデレータ
  • 可能な限り仰りたいことを考えてみました。
    Form1.AAA() メソッド内で 共通クラス.BBB() をコールすることは可能ですが、
    共通クラス.CCC() 内で 共通クラス.BBB() をコールするにはどうすればいいでしょうか?

    ということでしょうか?

    ひらぽん http://d.hatena.ne.jp/hilapon/

    2013年6月26日 15:56
    モデレータ
  • ひらぽん様

    おっしゃるとおりです。

    共通クラスないで自分自身を呼出したいのです。

    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);}

      }    

    2013年6月27日 8:10
  • ひらぽん様

    おっしゃるとおりです。

    共通クラスないで自分自身を呼出したいのです。

    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/


    2013年6月27日 9:29
    モデレータ
  •  原則として、次のすべての条件を満たす場合のみ、呼び出すことができます。

    • 存在している
    • 知られている

     「存在している」とは、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@わんくま同盟

    2013年6月27日 13:56
  •  書きためておいたのを、追加の投稿をよく見ずに投稿したのですが...

    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@わんくま同盟

    2013年6月30日 12:29