質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

別クラスから変数を受け取りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 35K+

score 121

以下のプログラムで別クラスの変数xを受け取り、引数として別クラスに渡したいのですが、どのような処理が必要でしょうか? 

ご指導ご鞭撻の程よろしくお願い致します。


public partial class Form1 : Form
 {   
        public float a ; // textboxの値を取ってきます
        public float b ; // textboxの値を取ってきます

        public void keisan()
        {
              Test.test(a,b)
        }

        public void save_bt_Click(object sender, EventArgs e)
        {   
            Save.save ( x ); // クラス「Test」内の変数、x を受け取り、引数で渡したい
        }
 }

 public partial class Test
 {
        public float x; 
        
        public static void test ( float a, float b )
        {
             Test t = new Test();
             t.x = a + b;
        }
 }

public class Save
{
     public static void save( float x)
     {
           StreamWriter sw = new System.IO.StreamWriter(
                                                         @"C:\data\file",
                                                         true,
                                                         System.Text.Encoding.GetEncoding("shift_jis")
                                                       );

           sw.WriteLine(String.Format("C {0}", x);
     }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

勘違いしてたらごめんなさい。

Testクラスのインスタンスはどのように管理するつもりであるのか明確にする必要があります。
たとえば以下のような
 A. save_bt_Click イベントサブスクライバ内でNewして使い捨てるのか
 B. Form1 クラス内の初期化時など別のメソッド実行時にインスタンスを作っておくのか
 C. シングルトンなのか

上記が明確になれば、あとは素直に渡してあげればいいかと 。
        // 前述のAのような場合
        public void save_bt_Click(object sender, EventArgs e) 
        {
            Test testObject = new Test();
                :
            Save.save ( a , b , testObject .x );
                :
            testObject = null;
        } 

        // 前述のBのような場合
        public void save_bt_Click(object sender, EventArgs e) 
        {
            // たとえばForm1クラスのインスタンスメンバに testClassInstance 変数が定義されているとして
            Save.save ( a , b , testClassInstance.x );
        } 

        // 前述のCのような場合
        public void save_bt_Click(object sender, EventArgs e) 
        {
            // たとえばTest クラスにInstance メソッドを解して唯一のインスタンスを返すような定義を作った場合
            Save.save ( a , b , Test .Instance().x );
        } 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/15 13:58

    プログラムを書き換えてもう一度投稿させて頂きますので、よろしければまたお答え願えませんでしょうか?

    キャンセル

  • 2015/10/16 17:32

    返信遅くなってしまって申し訳ありません。
    更新していただいたコードに対して再度提案させていただきます。
    以下3点を踏まえて
    1. Test クラスは何らかの理由によって partialでなければならないものとし追求しない
    2. Test.testメソッドは何らかの理由によって static 出なければならないものとし追求しない
    3. Form1.keisanメソッドが呼ばれるタイミングは追求しない(=keisanを実行せずに保存ボタンを押す場合もあると考える)

    書くとしたらとりあえず以下のようになります。

    public partial class Form1 : Form
    {
    public float a ; // textboxの値を取ってきます
    public float b ; // textboxの値を取ってきます
    public Test test = null;

    public void keisan()
    {
    test = Test.test(a,b);
    }

    public void save_bt_Click(object sender, EventArgs e)
    {
    if (test != null)
    Save.save ( x ); // クラス「Test」内の変数、x を受け取り、引数で渡したい
    }
    }

    public partial class Test
    {
    public float x;

    public static Test test ( float a, float b )
    {
    Test t = new Test();
    t.x = a + b;
    return t;
    }
    }

    public class Save
    {
    public static void save( float x)
    {
    StreamWriter sw = new System.IO.StreamWriter(
    @"C:\data\file",
    true,
    System.Text.Encoding.GetEncoding("shift_jis")
    );

    sw.WriteLine(String.Format("C {0}", x);
    }
    }

    以下は突っ込みも多いかもしれませんが、もう少しわかりやすい構造の例として

    public partial class Form1 : Form
    {
    public float a ; // textboxの値を取ってきます
    public float b ; // textboxの値を取ってきます

    public float? result;
    public Calculator m_Calculator;
    public Saver m_Writer;

    public void Form1()
    {
    result = null;
    m_Calculator = new Calculator();
    m_Writer = new Saver();
    }

    // 強引ですが、保存処理と加算処理を分離しなければならない状況の例として加算ボタンがあるものとします。
    public void btnAdd_Click(object sender, EventArgs e)
    {
    result = m_Calculator.Add(a,b);
    }

    public void save_bt_Click(object sender, EventArgs e)
    {
    if (result.HasValue)
    {
    m_Writer.Save(result.Value);
    result = null; // 連打対応(笑
    }
    }
    }

    // 計算クラス (この例においては静的ではないことに意味はないです。)
    public class Calculator
    {
    public float Add(float x, float y)
    {
    // とりあえず加算結果を返していますが、設計次第では「小数点何位までに丸める~」といった処理を追加したりする事も出来る
    return x + y;
    }
    }

    // 保存クラス (この例においては静的ではないことに意味はないです。)
    public class Saver
    {
    public void Save(float data)
    {
    var sw = new System.IO.StreamWriter(
    @"C:\data\file",
    true,
    System.Text.Encoding.GetEncoding("shift_jis")
    );

    sw.WriteLine(String.Format("C {0}", data);
    }
    }

    というところでしょうか。

    そもそもいわゆるWindowsフォームアプリケーションで考えた場合、且つ、単一フォーム内で完結する一連の動作において、インスタンスメンバを極力使わない実装方針は余り効果のあるものとは思えていません。

    キャンセル

  • 2015/10/20 14:29

    お返事大変遅くなり申し訳ございませんでした。

    ソースまで貼って頂きありがとうございます。
    大変参考になりました。

    キャンセル

0

Testクラスのインスタンスは、存在しないかもしれませんし複数存在するかもしれません。
「Testクラスのxフィールド」と言われてもどのインスタンスのxフィールドでしょうということになってしまいます。

よって「渡しようがない(渡したくてもどれを渡すのか決められない)」が答になります。

もう少し、どんなデータの流れを実現したいのかを明確化してみましょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/15 10:51

    お答えありがとうございます
    もう少しお付き合い願えませんでしょうか?

    上のプログラムを少し改良いたしました。
    Testクラスのインスタンスは、存在しないことと致します。

    この場合ですと渡すことはできないのでしょうか?

    イメージとしてはこのような形で渡せるんではないかと思っていたのですが、
    受け取ることができませんでした。

    public void save_bt_Click(object sender, EventArgs e)
    {
    hoge = Test.x
    Save.save ( a , b , hoge );
    }

    お手数おかけして申し訳ございませんが、どなた様かお答え願えませんでしょうか。

    キャンセル

  • 2015/10/15 12:12

    Ryznaさんの回答の方のRyznaさんのコメントの通りです。xがstaticフィールドであればその形で参照可能です。

    キャンセル

  • 2015/10/15 13:20

    お答えありがとうございます。

    staticフィールドで行えないプログラムであることが分かりました。
    インスタンスを持たせ、それを利用し、データの受け渡しをするような形になりようです。

    大変参考になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る