这种工厂方法的最佳解决方案是什么?

时间:2013-01-17 09:52:56

标签: c#

这是我的工厂方法模式的代码

public abstract class TestAbstract
{
    public abstract void MainFunc();
}

public class ClassA : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }
    private void Func1() { }
    private void Func2() { }
}
public class ClassB : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }
    private void Func1() { }
    private void Func2() { }
}

目前,ClassA和ClassB中的函数MainFunc都有几行相同。而且我不想在这些类中重复代码。我将MainFunc移动到TestAbstract类但它没有用。

我想要的是如何为两个类只有一个MainFunc,它可以在每个类中调用2个函数Func1和Func2。

非常感谢。

5 个答案:

答案 0 :(得分:2)

你的意思是template method pattern吗?如果我理解正确,请尝试以下操作,并在子类中将Func1和Func2作为覆盖。

public abstract class TestAbstract
{
    public void MainFunc(){ 
        //code for line 1
        //code for line 2
        //...
        Func1();
        Func2();
        //code for line 10
    }

    protected abstract void Func1();
    protected abstract void Func2();
}

要使MainFunc调用Func1和Func2,它需要知道它们存在。

答案 1 :(得分:2)

这称为“模板方法模式”。 MainFunc可以存在于抽象类中,并调用专门用于派生类的方法Func1和Func2。

public abstract class TestAbstract
{
    public void MainFunc() 
    { 
        //common code
        Func1();
        Func2(); 
    }

    // you can make these protected instead of public
    // if they are not meant to be called directly outside of your
    // derived classes    
    public abstract void Func1(); 
    public abstract void Func2();
}

public class ClassA : TestAbstract 
{
    public void Func1() 
    { //... logic for ClassA
    }

    public void Func2() 
    { //... logic for ClassA 
    }

}

答案 2 :(得分:1)

您可以将MainFunc移至TestAbstract,但您必须将Func1Func2声明为抽象函数。

答案 3 :(得分:1)

在这个例子中,ClassA只是从TestAbstract执行Func1和Func2,ClassB会覆盖这些函数。请注意base.MainFunction,因为您需要覆盖MainFunction

中的额外代码
void Main()
{
    ClassA a = new ClassA();
    a.MainFunc();
}

public class TestAbstract
{
    public virtual void MainFunc()
    {
    Func1();
    Func2();
    }
    public virtual void Func1() { "func1".Dump();}
    public virtual void Func2() { "func2".Dump();}
}

public class ClassA : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
 base.MainFunc();
        //code for line 10
    }

}
public class ClassB : TestAbstract
{
    public override void MainFunc()
    {
        //code for line 1
        //code for line 2
        //...
        base.MainFunc();
        //code for line 10
    }
    public override void Func1() { "func1".Dump();}
    public override void Func2() { }
}

答案 4 :(得分:0)

如果您愿意在抽象类中修改逻辑或只是简单的abstract,那么

而不是使用virtual使用MainFunc作为MainFunc