0

オブジェクトに 2 つのイベントをサブスクライブしようとしています。しかし、イベントを追加しようとする前にオブジェクトがインスタンス化されていません。これら 2 つのイベントをサブスクライブして、後でインスタンス化する方法はありますか? デリゲート、イベント、イベント引数、およびイベント ハンドラーは既に動作しています。

サンプルコード:

Ares a;

public B()
{
    a.up += new upEventHandler(doUp);
    a.down += new downEventHandler(doDown);
    a = new Ares();
}
4

4 に答える 4

3

2つのイベントをオブジェクトにサブスクライブしようとしています。しかし、イベントを追加しようとする前に、オブジェクトはインスタンス化されません。これらの2つのイベントをサブスクライブして、後でインスタンス化する方法はありますか?

いいえ、絶対にありません。これは、オブジェクトが存在する前にオブジェクトにプロパティを設定しようとするのとまったく同じです。それがどのように機能するかを考えてみてください。そして、サブスクライブされたイベントハンドラーが、プロパティと同じようにオブジェクトの状態の一部であることを理解してください。

明らかに、イベントハンドラーを別の場所に保存し、後でサブスクライブすることもできますが、前述のように、答えは単にノーです。概念レベルでも実用レベルでも意味がありません。

于 2012-07-31T17:25:04.233 に答える
1

不可能です。最初にオブジェクトをインスタンス化する必要があります。

于 2012-07-31T17:24:37.160 に答える
0

イベントはコンストラクターで発生し、それをキャプチャしたいと思います。

イベント起動コードをコンストラクターから別の Initialize() メソッドにリファクタリングしてみてください。そうすれば、次のようになります。

Ares a;

public B()
{
    a = new Ares();
    a.up += new upEventHandler(doUp);
    a.down += new downEventHandler(doDown);

    a.Initialize(); //do all init of the ares object here, not in constructor
}
于 2012-07-31T18:49:04.583 に答える
0

あなたが説明していることに最も近いことは、イベントを静的にすることです。

class Ares {
    public static event upEventHandler up;
    public static event downEventHandler down;
    // ...
}

そして、次のように変更B()します。

public B() {
    Ares.up += new upEventHandler(doUp);
    Ares.down += new downEventHandler(doDown);
    a = new Ares();
}
于 2012-07-31T18:14:41.763 に答える