2

FormAとFormBの2つのフォームがあるとします。

FormAにはいくつかのプロパティがあります。FormAはFormBを作成し、所有者プロパティを設定します。例えば:

public FormA() 
{
    FormB = new FormB(){Owner = this};
}

ここで、FormBで、FormAで宣言したプロパティにアクセスしたい場合。私が書いているときになぜ私はそれらを見ることができないのですか?

Owner. // here I need to see FormA properties...

なぜこのように機能しないのですか?

4

3 に答える 3

4

これを試して:

var forma = Owner as FormA;
forma.Stuff = otherstuff;
于 2013-03-14T21:56:44.627 に答える
4

継承とポリモーフィズムのために見ることができません。

.NETのフォームは、Formと呼ばれる基本クラスから継承します。FormAは、FormBと同様に、Formから派生したクラスです。

これで、フォームには所有者フォームへの参照があります。

public Form Owner { get; }

FormAを割り当てました。問題ない!派生クラスは、基本クラスとして扱うことができます。ただし、アクセスするとフォームが返されるため、実際に提供したフォームに新しいフォームをキャストする必要があります。

FormA form = (FormB)Owner;

これは、次のこととほぼ同じです。

FormA form = Owner as FormB;

ただし、いくつかの注意点があります。演算子は「asセーフキャスト」であり、オブジェクトが指定されたタイプでない場合はnullを返します。

私たちが提供したコードだけをお勧めします。時間があれば、継承とポリモーフィズムを研究してください。それらは、何が起こっているのかを理解するための鍵です。

私が自己宣伝をするかもしれないなら、私はあなたが一般的にあなたが面白いと思うかもしれないものをやがて避ける理由についての記事を書きました。as

于 2013-03-14T21:59:25.467 に答える
3

その理由は、ポリモーフィズムと呼ばれる概念です。より具体的な意味では、OwnerプロパティはタイプFormです。 FormAタイプから継承するFormので、ある意味では、Formと同様にFormAです。FormAこれを回避する方法は、次のように、所有者をとして「キャスト」することです。

FormA fa = Owner as FormA;
if (fa != null)
{
    // do something
}

ここで確認したい理由nullは、他の誰かがあなたを使用していて、プロパティをタイプにFormB設定しているためです。これは必ずしも制御できるとは限りません。その場合、コードはを返します。したがって、nullチェックにより、厄介な驚きが発生しないことが保証されます。OwnerFormCOwner as FormAnull

于 2013-03-14T22:09:42.993 に答える