必要に応じて、次の2つの異なることができます。
デリゲートを保持する変数を作成できます (変数の型は前述のデリゲートになります)。オブジェクトの外部に機能を実装できるようにする場合は、ほとんどの場合、これを行います。このことを使用して値を返すこともできるため、オブジェクトの状態を変更するために使用できます。
イベントを作成できます。オブジェクトで何かが発生するのを防ぐことができるようにしたい場合は、これを行います。イベントを発生させます。オブジェクトは、後で何が起こっているかをまったく認識してはなりません。これは通常、ビューを実装するときに行うことです。コントローラーがビューで何が起こっているかを認識できるように、いくつかのイベントを発生させます。その後、ビューをどうするかを決めることができます。
最初の例では、名前の取得はコントローラーで定義されておらず、外部で設定する必要があります。コントローラーはそれがどのように機能するかわかりませんが、整数 ID の名前を取得したいと考えています。インターフェイスと同じように機能します。
public class MyController {
private NameForIDFetcher NameFetcher { get; set; }
private List<int> _ids = new List<int>();
public delegate string NameForIDFetcher(int id);
public void showNames() {
if (this.NameFetcher == null) {
throw new Exception("No NameFetcher set.");
}
foreach (int id in this._ids) {
Console.WriteLine(id + ": " + this.NameFetcher(id));
}
}
}
2 番目の例では、ビューは、イベントが表示されたり消えたりするときに、イベントに接続されている可能性のあるすべてのリスナーを防ぐことができます。ただし、誰も接続されていない場合、ビューはその動作を変更するべきではありません (変更すべきケースを誰かが知っている場合はお知らせください)。2 回目に Action を使用したことに注意してください。これは、void を返し、パラメーターで指定したテンプレートを取得するジェネリック デリゲートです。最大 16 個のテンプレート パラメーターを使用できます。つまり、デリゲートは 16 個のパラメーターを受け取ることになりますが、それは本当に厄介なデリゲートになるのではないでしょうか?
public class MyView {
public event ViewAction onViewAppeared;
public event Action<MyView> onViewDisappeared;
public delegate void ViewAction(MyView view);
public void show() {
// Stuffs
if (this.onViewAppeared != null) {
this.onViewAppeared(this);
}
}
public void hide() {
// Stufs
if (this.onViewDisappeared != null) {
this.onViewDisappeared(this);
}
}
}