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

クラスの中の共通の型の宣言の仕方

環境/言語:[C# NET Framework3.5]
分類:[.NET]

クラス clsTest1とクラス clsTest1_5の中でclsTest2を使いたいと思っています。
そのクラスのthisをclsTest2の中の引数で渡す時に型の設定をしないといけないと
思いますが
clsTest1とclsTest1_5の両方の名前を宣言しないといけないのでしょうか?
clsTest1とclsTest1_5の共通で使える型や宣言はありませんか?

よろしくお願いします。

C# NET Framework3.5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class clsTest1 {

  clsTest2 clsTest2;

  public clsTest1() {
   // clsTest2 = new clsTest2(this);
  }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class clsTest1_5 {

  clsTest2 clsTest2;

  public clsTest1_5() {
   clsTest2 = new clsTest2(this);
  }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class clsTest2 {

  clsTest1_5 tes;

  public clsTest2(clsTest1_5 a) {
    tes = a;
  }

}
■No26172に返信(たなかさんの記事)
> クラス clsTest1とクラス clsTest1_5の中でclsTest2を使いたいと思っています。
> そのクラスのthisをclsTest2の中の引数で渡す時に型の設定をしないといけないと
> 思いますが
> clsTest1とclsTest1_5の両方の名前を宣言しないといけないのでしょうか?
> clsTest1とclsTest1_5の共通で使える型や宣言はありませんか?
> 
> よろしくお願いします。
> 
> C# NET Framework3.5
> 
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> 
> class clsTest1 {
> 
>   clsTest2 clsTest2;
> 
>   public clsTest1() {
>    // clsTest2 = new clsTest2(this);
>   }
> 
> }
> 
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> 
> class clsTest1_5 {
> 
>   clsTest2 clsTest2;
> 
>   public clsTest1_5() {
>    clsTest2 = new clsTest2(this);
>   }
> 
> }
> 
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> 
> class clsTest2 {
> 
>   clsTest1_5 tes;
> 
>   public clsTest2(clsTest1_5 a) {
>     tes = a;
>   }
> 
> }
> 

文章がわかりにくいですが、整理すると
1. clsTest1 と clsTest1_5 の両方で clsTest2 を使用している。
2. clsTest1 と clsTest1_5 のコンストラクタでは clsTest2 のコンストラクタにそれぞれ自分自身のクラスを渡している。
3. clsTest2 に clsTest1 と clsTest1_5 を引数として取るコンストラクタを書かなくてはいけないのか?
   共通で使える宣言などはないのか?
ということでしょうか。

現在のコードでは clsTest1 と clsTest1_5 はそれぞれ独立したクラスなので、両方の引数をとるコンストラクタを
用意しなくてはいけないと思います。
共通性を持たせるならば clsTest1 と clsTest1_5 の上位にインターフェースなどを用意して、clsTest2 ではその
インターフェースクラスを宣言するという方法もあるかと思います。

たとえばこんな感じ。

class clsTest0 {
}

class clsTest1 : clsTest0 {
  clsTest2 clsTest2;

  public clsTest1() {
   clsTest2 = new clsTest2(this);
  }
}

class clsTest1_5 : clsTest0 {
  clsTest2 clsTest2;

  public clsTest1_5() {
   clsTest2 = new clsTest2(this);
  }
}

class clsTest2 {
  clsTest0 tes;

  public clsTest2(clsTest0 a) {
    tes = a;
  }
}

ただ、目的がよくわからないので、自分としては clsTest1 と clsTest1_5 を引数に持つコンストラクタ
を両方持つ方が良いと思います。
ぽぴ王子さん 返信ありがとうございます。

上位インターフェースを使う方法があったんですね。
これは質問ですがclsTest0を経由して clsTest1 のdoメソッドを実行することは
できるでしょうか?
よろしくお願いします。

class clsTest1 : clsTest0 {
  clsTest2 clsTest2;

  public clsTest1() {
   clsTest2 = new clsTest2(this);
  }
  private void do() {

  }
}

class clsTest2 {
  clsTest0 tes;

  public clsTest2(clsTest0 a) {
    tes = a;
  }
  private void test() {
    tes.do();
  }
}


■No26173に返信(ぽぴ王子さんの記事)
> ■No26172に返信(たなかさんの記事)
>>クラス clsTest1とクラス clsTest1_5の中でclsTest2を使いたいと思っていま

> たとえばこんな感じ。
>
> class clsTest0 {
> }
>
> class clsTest1 : clsTest0 {
>   clsTest2 clsTest2;
>
>   public clsTest1() {
>    clsTest2 = new clsTest2(this);
>   }
> }
>
> class clsTest1_5 : clsTest0 {
>   clsTest2 clsTest2;
>
>   public clsTest1_5() {
>    clsTest2 = new clsTest2(this);
>   }
> }
>
> class clsTest2 {
>   clsTest0 tes;
>
>   public clsTest2(clsTest0 a) {
>     tes = a;
>   }
> }
>
> ただ、目的がよくわからないので、自分としては clsTest1 と clsTest1_5 を引数に持つコンストラクタ
> を両方持つ方が良いと思います。
■No26175に返信(たなかさんの記事)
> 上位インターフェースを使う方法があったんですね。
> これは質問ですがclsTest0を経由して clsTest1 のdoメソッドを実行することは
> できるでしょうか?
オブジェクト指向における多態性(ポリモーフィズム)の考え方について勉強してみてください。
一例として、こちらのサイトを挙げておきます。

http://ufcpp.net/study/csharp/oo_polymorphism.html
Azuleanさん 返信ありがとうございます。

下記のサイトとても参考になりました!
オブジェクト指向の多態性についてかなり学ばせていただきました。

インターフェースクラスとなるclsTest0の中に他のクラスと同じ名前のvoid関数を作り
修飾子virtualをつけ clsTest1クラス内にvoid関数にoverrideをつけたところ
clsTest2の中でclsTest1クラスのvoid関数実行することができました、
期待した動きが実現できたと思っています!

ありがとうございます。一歩前進しました!

Azuleanさん
ぽぴ王子さん

ありがとうございました!

class clsTest0 {

  public clsTest0() {

  }
public virtual void do() {
   Console.WriteLine(" clsTest0 ");
  }

}

class clsTest1 : clsTest0 {
  clsTest2 clsTest2;

  public clsTest1() {
   clsTest2 = new clsTest2(this);
  }
  private override void do() {
   Console.WriteLine(" clsTest1 ");
  }
}

class clsTest2 {
  clsTest0 tes;

  public clsTest2(clsTest0 a) {
    tes = a;
    tes.do();
  }

}
解決済み!

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