我已经从它基抽象类和派生类。当我从派生类调用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"
}
是否可以在decorator中取消订阅base.Method2并通过decorator.Method2进行订阅?
答案 0 :(得分:1)
因此,您的解决方案正在调用装饰器的OnEventInvoke,但您正在修改对成员的订阅。如果要保留组成,可以执行以下操作:
!=