我有基本的抽象类和从中派生类。当我从派生类调用 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();
}
}
- 1 回答
- 0 关注
- 123 浏览
添加回答
举报
0/150
提交
取消