没有继承的模板方法模式

时间:2013-07-17 06:53:13

标签: 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 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,我怎样才能获得相同的结果?

3 个答案:

答案 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");
        }
}