亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在裝飾器中取消訂閱活動

如何在裝飾器中取消訂閱活動

C#
HUWWW 2022-08-20 16:16:12
我有基本的抽象類和從中派生類。當我從派生類調用 Method1() 時,Event 上有一個訂閱。我需要為派生類創建裝飾器并替換一些功能,我不需要從基類調用Method1()。所以我試圖在裝飾器的構造中取消訂閱,但它不起作用?;a和派生代碼的結構是遺留的。    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 關注
  • 112 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號