C# 无继承的模板方法模式
如何实现模板方法模式的变体,使具体类不从基类继承,但保持模式的整体特性。它无法继承的原因是它被迫从另一个类继承,并且多重继承不可用 例如,假设以下Tempate方法模式:C# 无继承的模板方法模式,c#,.net,oop,design-patterns,template-method-pattern,C#,.net,Oop,Design Patterns,Template Method Pattern,如何实现模板方法模式的变体,使具体类不从基类继承,但保持模式的整体特性。它无法继承的原因是它被迫从另一个类继承,并且多重继承不可用 例如,假设以下Tempate方法模式: public abstract class BaseClass { public void Alpha() { Beta(); } public abstract void Beta(); public void Gamma() { Delta();
public abstract class BaseClass {
public void Alpha() {
Beta();
}
public abstract void Beta();
public void Gamma() {
Delta();
}
public abstract void Delta();
}
public ConcreteClass : BaseClass {
public override void Beta() {
Gamma();
}
public override void Delta() {
Console.WriteLine("Delta");
}
}
...
var object = new ConcreteClass();
object.Alpha(); // will outout "Delta"
如果ConcreteClass不继承基类,我如何才能获得相同的结果?基类可能依赖于通过构造函数注入的接口(或其他类型)。然后,您的模板方法可以使用此接口/类型上的方法来实现模式的预期结果:
public class BaseClass
{
IDependent _dependent;
public BaseClass(IDependent dependent)
{
_dependent = dependent;
}
public void Alpha() {
_depdendent.Beta();
}
public void Gamma() {
_depdendent.Delta();
}
}
有效地使用组合而不是继承。您可以通过在方法调用时提供对基类的引用来实现这一点:
public ConcreteClass {
public void Beta(BaseClass baseClass) {
baseClass.Gamma();
}
public void Delta() {
Console.WriteLine("Delta");
}
}
如果这是C#,那么如果没有ConcreteClass继承BaseClass,您就无法执行
BaseClass object=new ConcreteClass()
。你现在到底拥有什么以及你想要达到什么?还不清楚你拥有什么课程这解决了一半的问题。另一半是我需要从IDependent对象调用基类方法。可以使用另一个接口,但是有没有更好的解决方案?您可以给依赖项一个基类的引用。但开始有点臭了。OOD的不安程度正在上升,这表明这不是正确的解决方案…我复制了MVP模式(减去“模型”),并使“视图”类具有它触发的事件。听起来是一个合理的解决方案。