JavaではイベントハンドラなどObserver/Subjectなパタンは下記のようなコードになりますが、C#ではdelegateやeventなど言語レベルでいろいろサポートされてるみたいです まずはJavaで †public class Program { public static void main(String[] str) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void action(String str) { System.out.println(str); } class MyObserver implements Observer { public void update(String str) { action(str); } } } interface Observer { void update(String str); } class Subject { private String str; private Observer observer; public Subject(String str) { this.str = str; } public void notifyObservers() { observer.update(str); } public void addObserver(Observer observer) { this.observer = observer; } } こんなヤツですね まずはC#でJavaっぽく †using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ObserverSample { class Program { static void Main(string[] args) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void Action(String str) { Console.WriteLine(str); } class MyObserver : Observer { public void update(String str) { Action(str); } } } } namespace ObserverSample { // 以下はJavaと全く同じコード interface Observer { void update(String str); } class Subject { private String str; private Observer observer; public Subject(String str) { this.str = str; } public void notifyObservers() { observer.update(str); } public void addObserver(Observer observer) { this.observer = observer; } } } 次にC#でdelegateを使ってみる †using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ObserverSample2 { class Program { static void Main(string[] args) { new Program(); } public Program() { Subject obj = new Subject("hogehoge"); obj.update += new update(Action); //<-C#ではこうやってObserverを追加する //obj.addObserver(new MyObserver()); obj.notifyObservers(); } static void Action(String str) { Console.WriteLine(str); } //class MyObserver : Observer //{ // public void update(String str) // { // Action(str); // } //} } } namespace ObserverSample2 { // Observerのインタフェースは使わない //interface Observer //{ // void update(String str); //} // Observerのインタフェース(リスナ)のメソッドをdelegateで宣言 delegate void update(String str); class Subject { private String str; // フィールドの変数をdelegateに変更する //private Observer observer; public update update; // <-実はdelegate public Subject(String str) { this.str = str; } public void notifyObservers() { //observer.update(str); update(str); //delegateに処理を委譲する } // addは使わない(+=で追加するので) //public void addObserver(Observer observer) //{ // this.observer = observer; //} } } これでいいみたいです。これいいですね
などなどいろいろメリットがありますね eventを使う †続いてeventを使ってみます。eventは基本的にはdelegateと同じみたいですが、委譲するメソッドとなる update(str); を外から直接呼び出せなくなるなど、いくつかイベントハンドラ向けの機構が備わってるみたいです 指定方法は public update update; -> public event update update; ってするだけですね。呼び出す側のコードはこれまでと同じです public Program() { Subject obj = new Subject("hogehoge"); obj.update += new update(Action); obj.notifyObservers(); // obj.update("hoge"); <-これはコンパイルエラーになる。 } なるほどー 関連リンク †この記事は 現在のアクセス:2950 |