为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
HUWWW 2022-08-20 16:16:12
我有基本的抽象类和从中派生类。当我从派生类调用 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?
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

因此,您的解决方案是调用装饰器的 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();

    }

}


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号