DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数のFormを同じクラスの中で一つの変数にまとめたい。

環境/言語:[C# .Net 3.5]
分類:[.NET]

複数のFormクラスを同じクラスの中で一つの変数にまとめたいと思っています。

現在はクラスの中にForm1とForm2用の変数をそれぞれを作り条件式で分けて使っています。
これを一つの共通変数にまとめ使うことはできないでしょうか?

Formクラスではなくオリジナルの複数のクラスファイルをインターフェースクラスで結びvirtualとoverrideで使うやり方はできたのですが

このようなForm1:Formなどでもできるのでしょうか?

よろしくお願いします。

Form1.cs

public partial class Form1:Form {
  clsTest clsTest;
  public Form1() {
   InitializeComponent();
   clsTest = new clsTest(this,null);
  }
}

Form2.cs

 public partial class Form2:Form {
  clsTest clsTest;
  public Form2() {
   InitializeComponent();
   clsTest = new clsTest(null,this);
  }
 }

clsTest.cs

public class clsTest {

 Form1 f1;
 Form2 f2;
 public clsTest(Form1 f1_1,Form2 f2_2) {
  f1 = f1_1;
  f2 = f2_2;
 }
private void _test(){
  if(f1 != null){

  }else if(f2 != null){

  }
 }
}
clsTestでやりたい操作が全部Formの範疇なら何も考えずにForm型で操作すれば済みます。
それですまないならインターフェースにすればいいでしょう。
別にForm以外のクラスでもFormでも何ら変わりはありません。

まあ、やりたいことによっては更に別の方法がいいかも知れませんが、
今の情報では何とも言えないですね。
なちゃさん

お返事ありがとうございます。
Form型を使用するとForm型範囲内のメソッドやプロパティは使えるのですが
Form1.cs内で定義された関数を読み出すことができないのですがこれを呼ぶことは可能でしょうか?

class clsTest {

  Form f;

  public clsTest() {

  }

  public void _test() {

   Console.WriteLine(this.f.Name); // ○ Form型のプロパティ

   this.f._test();// エラー Form1.cs内のオリジナルの関数

  }

  public Form F{
   set {
    this.f = value;
   }
  }
}

■No26889に返信(なちゃさんの記事)
> clsTestでやりたい操作が全部Formの範疇なら何も考えずにForm型で操作すれば済みます。
> それですまないならインターフェースにすればいいでしょう。
> 別にForm以外のクラスでもFormでも何ら変わりはありません。
>
> まあ、やりたいことによっては更に別の方法がいいかも知れませんが、
> 今の情報では何とも言えないですね。
>
■No26891に返信(かとうさんの記事)
> Form型を使用するとForm型範囲内のメソッドやプロパティは使えるのですが
> Form1.cs内で定義された関数を読み出すことができないのですがこれを呼ぶことは可能でしょうか?
Form 型として利用する限り無理です。
ダウンキャストすれば使えるかもしれませんが、それをするくらいなら最初から別の変数にするべきだと思います。

そもそも、なぜまとめたかったんでしょうか?
まとめることでどうなることを期待したのでしょうか?


たとえば、Form1 か Form2 のどちらかが渡されて、そのどちらかを処理するのに、if ブロックで分岐を書きたくないと言うことだったとします。
この場合、同じインターフェースを定義して実装するのが理想です。
それができないのであれば、どうがんばっても if ブロックの分岐が発生すると思いますので、残念ながら、まとめる意味を見いだせません。
たとえば、以下のように、Form1 と Form2 で渡された場合に別々の処理をする必要があったとします。

class clsTest {
  Form1 f1;
  Form2 f2;
  // コンストラクタを含む、途中略
  private void _test(){
    if(f1 != null){
      f1.aaa();
    }else if(f2 != null){
      f2.bbb();
    }
  }
}

この場合、_test で実行したい処理というのをインターフェースでくくり出して、Form1, Form2 の両方で実装すれば良いでしょう。
(くくり出し方はあくまで一例です。状況にあったくくり出し方を考えてください)

interface ITest {
  void _test();
}

class Form1 : Form, ITest  {
  // 途中略
  void _test() { aaa(); }
}

class Form1 : Form, ITest {
  // 途中略
  void _test() { bbb(); }
}

class clsTest {
  ITest target;
  public clsTest(ITest targetForm) {
  }
  private void _test(){
  target._test();
 }
Azuleanさん 回答ありがとうございます。

自分が実現したかったことはこのインターフェースを使用し、Form.csを複数で使いたいクラスにダウンキャストすることで実現できました。
どうもありがとうございます! インターフェースという機能は名前は知っていましたが使う機会がなくて、今日のこの問題解決で実際使用でき理解を深めることができました。どうもありがとうございます。
解決済み!
■No26896に返信(かとうさんの記事)
> 自分が実現したかったことはこのインターフェースを使用し、Form.csを複数で使いたいクラスにダウンキャストすることで実現できました。

ちょっと待った!
ダウンキャストすることって、何ですか?

どんな感じのコードにしたか、見せていただけませんか?

DOBON.NET | プログラミング道 | プログラミング掲示板