Top / C# / いまさらヒトに聞けないこといろいろ / イベント処理

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;
        //}
    }
}

これでいいみたいです。これいいですね

などなどいろいろメリットがありますね


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / C# / いまさらヒトに聞けないこといろいろ / イベント処理

現在のアクセス:2813


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS