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

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

我在这里想要的是我如何才能为两个类都拥有一个 MainFunc,并且它可以正确调用每个类中的 2 个函数 Func1 和 Func2。

非常感谢。

4

5 回答 5

2

你的意思是模板方法模式吗?如果我理解正确,请尝试以下操作,并将 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,需要知道它们存在。

于 2013-01-17T09:56:41.767 回答
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 
    }

}
于 2013-01-17T09:56:47.490 回答
1

您可以移至MainFuncTestAbstract但必须将Func1和声明Func2为抽象函数。

于 2013-01-17T09:56:16.580 回答
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() { }
}
于 2013-01-17T10:05:53.410 回答
0

如果您愿意修改逻辑或只是抽象类中的简单,而不是使用abstractusevirtualMainFuncMainFunc

于 2013-01-17T09:56:32.263 回答