頭を柔らかく(まどか の ぶろぐ)より:
いやいや、否定する点は無いのだが、「あり」の中で私の書いた例は設計の結果として「あり」の一部ではないと思うのだが。
いっしょだよ、と言われればそれまで。というのも納得している。でも。。。
MDI子フォームからMDI子フォームの操作(どぼん!のプログラミング道場掲示板)より:
今までは
「子フォームA」のプロパティに「子フォームB」、
「子フォームB」のプロパティに「子フォームA」を追加して
親フォームから子フォームのインスタンスを作成する時に
それぞれのプロパティにインスタンスを渡し、
「子フォームA」から「子フォームB」を操作する時は
「子フォームB」の入ったプロパティから直接操作していたのですが
一元管理の為、
親フォームに「子フォームA」、「子フォームB」プロパティを持たせて
「子フォームA」から「子フォームB」を操作する時は
親フォームの「子フォームB」プロパティを操作しようと思っているのですが
この方法で間違いはないでしょうか?
私はまどかさんと同じで、避けるべき、だと思う。
FormA が確定するためには FormB が確定しなければならず、FormB が確定するためには FormA が確定しなければならない。その FormA が確定するためには...と、無限ループにはまっているわけです。
設計的には、FormB にやって欲しい操作、外から指示される操作をインターフェイスとして定義、FormB はそれを実装する。FormA はそのインターフェイスを持ち、インターフェイスを通して FormB を操作する。
反対も同じ。
こうすることで、フォームが依存するのはインターフェイスとなり、インターフェイスが確定すれば、フォームは確定できる。
実装上、FormA のインスタンス内で FormB のインスタンスを参照し、FormB のインスタンス内で FormA のインスタンスを参照することは、ある。れいさんは、こっちの意味じゃないかなぁ?
まどかさんが誤解しているとすれば、循環参照は「今までしていた」。これからしようと思っている、「親フォームがすべて管理する」方法をどう思うか、という質問のポイントではないか、と。。。
と、思ったのですが、#20771 を見ると、そうじゃないですね。ダメだよぉ。。。
設計として、知っている人が循環しちゃダメ!
後から出てくる、「Parent プロパティ」は Control クラスに定義されていて、これは自己参照です。設計図の循環参照ではありません。
interface IOperater {
void ShowChild(int childNumber);
}
public class ParentForm : Form, IOperater
{
void ShowChild(int childNumber)
{
switch (childNumber)
{
case 1:
this._frmA.Show();
break;
case 2:
this._frmB.Show();
break;
default:
}
}
private FormB _frmB;
public FormB frmB // ReadOnly
{
get
{
return _frmB;
}
}
// FormA は省略
public ParentForm()
{
this._frmB = new FormB();
this._frmA = new FormA();
}
}
class FormA : Form
{
void FormBを開きたくなるメソッド()
{
IOperater p = this.Parent as IOperater;
if (p != null) {
p.ShowChild(2);
}
}
}
投稿日時 : 2007年10月17日 20:44