如何取消订阅装饰器中的事件

时间:2019-02-01 19:29:31

标签: c# events design-patterns

我已经从它基抽象类和派生类。当我从派生类调用Method1()时,有一个Event订阅。 我需要为派生类创建装饰器并替换某些功能,并且不需要从基类调用Method1()。所以我试图取消装饰器构造中的订阅,但它不起作用。 基本代码和派生代码的结构是遗留的。

    abstract class Base {
        public event Action Event;
        public abstract void Method1();
        public virtual void Method2(){ Console.WriteLine("Base Method2 call"); }
        public void OnEventInvoke() { Event?.Invoke();}
    }

    class Derived : Base{
        public override void Method1() { Event += Method2;}
    }

    class Decorator: Base {
        private Base b;
        public Decorator(Base b){
            this.b = b;
            b.Event -= base.Method2;
            b.Event += Method2;
        }
        public override void Method1(){}
        public override void Method2(){Console.WriteLine("Decorator Method2 call");}
    }

    static void Main(string[] args){
        var derived = new Derived();
        derived.Method1();
        derived.OnEventInvoke();
        var decorator = new Decorator(derived);
        decorator.OnEventInvoke();  //need "Decorator Method2 call"
    }

是否可以在decorator中取消订阅base.Method2并通过decorator.Method2进行订阅?

1 个答案:

答案 0 :(得分:1)

因此,您的解决方案正在调用装饰器的OnEventInvoke,但您正在修改对成员的订阅。如果要保留组成,可以执行以下操作:

!=