2013-01-17 116 views
0

这里是我的工厂方法模式,这是什么工厂方法的最佳解决方案

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() { } 
} 

代码目前,功能MainFunc两个ClassA和ClassB的有几行是相同的。我不想在这些类中重复代码。我将MainFunc移动到TestAbstract类,但它不起作用。

我想这里是我如何才能有一个MainFunc两个类,它可以调用2个功能FUNC1和FUNC2每班正确的。

非常感谢。

回答

1

您可以将MainFunc移动到TestAbstract,但是您必须在那里声明Func1Func2作为抽象函数。

+0

是的。就像上面的解决方案。谢谢你的帮助。 –

0

而是采用abstract使用virtualMainFunc如果你愿意修改逻辑或只是一个简单的MainFunc在抽象类

+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,它需要知道它们存在。

+0

你可能是指'公共abstract'或'为FUNC1和FUNC2 –

+0

是保护abstract'。我会看到这个解决方案。谢谢你的帮助。 –

+0

@PaoloFalabella理想情况下,模板方法应该是唯一从外部调用的方法。它不应该是不公开的,除非它需要非私人 –

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 
    } 

} 
+0

+1的基本实现用于使方法成为非虚拟的(如果它是Java,则为'final')或抽象的,这通常使界面更清晰并且实现更稳定。 –

+0

一年。非常感谢。我已经应用了它的成功。 –

+1

没有模板的模式,但_template method_模式 – sll

1

在这个例子中,ClassA只是从TestAbstract执行Func1和Func2,ClassB覆盖了函数。请注意0​​,因为您需要覆盖的额外代码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() { } 
} 
+0

是的。我会看到这个解决方案。谢谢你的帮助。 –

相关问题