Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无继承的模板方法模式_C#_.net_Oop_Design Patterns_Template Method Pattern - Fatal编程技术网

C# 无继承的模板方法模式

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();

如何实现模板方法模式的变体,使具体类不从基类继承,但保持模式的整体特性。它无法继承的原因是它被迫从另一个类继承,并且多重继承不可用

例如,假设以下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不继承基类,我如何才能获得相同的结果?

基类可能依赖于通过构造函数注入的接口(或其他类型)。然后,您的模板方法可以使用此接口/类型上的方法来实现模式的预期结果:

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模式(减去“模型”),并使“视图”类具有它触发的事件。听起来是一个合理的解决方案。