Macros haxe:如何创建整洁的观察者模式原型

Macros haxe:如何创建整洁的观察者模式原型,macros,observer-pattern,haxe,Macros,Observer Pattern,Haxe,我创建了简单的观察者原型: class CObservable<T> { public function new() { mObservers = new Array<T>(); } public function sign(aObserver:T):Bool { for (observer in mObservers) if (observer == aObserver)

我创建了简单的观察者原型:

class CObservable<T> {

    public function new() {
        mObservers = new Array<T>();
    }

    public function sign(aObserver:T):Bool {
        for (observer in mObservers)
            if (observer == aObserver)
                return false;
        mObservers.push(aObserver);
        return true;
    }

    private var mObservers:Array<T>;

}
然后我用一些具体的类来扩展原型:

class CConcreteObservable extends CObservable<IConcreteObserver> {

    public function new() {
        super();
    }

    public function notifyStart():Void {
        for (observer in mObservers)
            observer.onStart(this);
    }

    public function notifyStop():Void {
        for (observer in mObservers)
            observer.onStop(this);
    }

    // ... more notify methods for every callback ...
    // ... more and more ...
    // ... and even more ...

}
类CConcreteObservable扩展了CObservable{
公共职能(新增){
超级();
}
公共函数notifyStart():Void{
用于(移动服务器中的观察者)
onStart观察员(本);
}
公共函数notifyStop():Void{
用于(移动服务器中的观察者)
observer.onStop(本);
}
//…每个回调的更多notify方法。。。
//…越来越多。。。
//……甚至更多。。。
}

所有这些复制粘贴对我来说都是不切实际的,尤其是当我有十几种回调方法时。声明一个简单的
notify
方法,或者在原型中可能是宏并调用它们,比如
notify(onStart)
notify(onStop)
等等,有什么巧妙的技巧吗?

这里有点不清楚您想要实现什么,但它看起来像是某种奇怪的Java模式,在一种具有一流函数的语言中毫无意义。我建议在Haxe中使用信号。看看or,我试图为每个观察者类使用干净的描述性接口(onStart,onStop…),而不是奇怪的面向函数的回调(sign(eventType,eventListener)——什么是事件类型?什么是侦听器语法?)。因此,当具体的observable类发送一些通知时,它调用实现相应接口的每个观察者的一个重要方法。它有一个很大的缺点,即使您不需要所有事件,您也必须至少在observer类中实现虚拟函数,或者我必须将所有数量的可能事件拆分为一堆不同的接口。当然,我可以创建类似于
signStart(listener:ccontreObservable->Void)
signStop的东西(监听器:CConcreteObservable->Void)
等等,没有任何接口。但是,对于不同监听器引用的内部容器列表,它将产生相同或更严重的复制粘贴问题。没有“事件类型”涉及。我建议您实际阅读我建议的内容。我还想指出,Haxe的枚举充当代数数据类型,因此您可以强制处理程序处理许多不同的通知,例如,
enum Message{Start;Stop;}
然后有一个
信号
。没有复制粘贴或任何东西。谢谢。这些库看起来正是我需要的。
class CConcreteObservable extends CObservable<IConcreteObserver> {

    public function new() {
        super();
    }

    public function notifyStart():Void {
        for (observer in mObservers)
            observer.onStart(this);
    }

    public function notifyStop():Void {
        for (observer in mObservers)
            observer.onStop(this);
    }

    // ... more notify methods for every callback ...
    // ... more and more ...
    // ... and even more ...

}