如何在装饰器中取消订阅活动

我有基本的抽象类和从中派生类。当我从派生类调用 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"

    }

是否可以从基地取消订阅。方法2在装饰器和订阅装饰器。方法2?


HUWWW
浏览 124回答 1
1回答

哈士奇WWW

因此,您的解决方案是调用装饰器的 OnEventInvoke,但您正在修改对成员的订阅。如果要保留合成,可以执行以下操作:class Decorator : Base{    private Base b;    public Decorator(Base b)    {        this.b = b;        b.Event -= b.Method2;        b.Event += Method2;    }    public override void Method1() { }    public override void Method2() { Console.WriteLine("Decorator Method2 call"); }    public override void OnEventInvoke()    {        b.OnEventInvoke();    }}
打开App,查看更多内容
随时随地看视频慕课网APP