我有基本的抽象类和从中派生类。当我从派生类调用 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?
哈士奇WWW
相关分类