如何实现模板方法模式的变体,使具体类不从基类继承,但保持模式的整体特征。它无法继承的原因是它被迫从另一个类继承并且多重继承不可用。
例如,假设以下Tempate方法模式:
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继承BaseClass,我怎样才能获得相同的结果?
答案 0 :(得分:3)
您的基类可能依赖于通过构造函数注入的接口(或其他类型)。然后,您的模板方法可以使用此接口/类型上的方法来实现模式的预期结果:
public class BaseClass
{
IDependent _dependent;
public BaseClass(IDependent dependent)
{
_dependent = dependent;
}
public void Alpha() {
_depdendent.Beta();
}
public void Gamma() {
_depdendent.Delta();
}
}
有效地使用构图而不是继承。
答案 1 :(得分:0)
如果我理解正确(您的代码对我来说不太清楚),您的ConcreteClass
目前正在继承SomeOtherClass
,要将模板方法添加到ConcreteClass
,您可以扩展您的ConcreteClass
班级abstract
:
public abstract class TplConcreteClass : ConcreteClass{
public void Alpha() {
Beta();
}
public abstract void Beta();
public void Gamma() {
Delta();
}
public abstract void Delta();
}
比创建新的具体类来实现模板方法:
public NewConcreteClass : TplConcreteClass {
public override void Beta() {
Gamma();
}
public override void Delta() {
Console.WriteLine("Delta");
}
}
这样你的客户端代码就可以工作......
答案 2 :(得分:0)
您可以通过在方法调用上提供对基类的引用来实现此目的:
public ConcreteClass {
public void Beta(BaseClass baseClass) {
baseClass.Gamma();
}
public void Delta() {
Console.WriteLine("Delta");
}
}