我有基本的抽象類和從中派生類。當我從派生類調用 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();
}
}
- 1 回答
- 0 關注
- 112 瀏覽
添加回答
舉報
0/150
提交
取消