0

我有一堆类,我试图重构和抽象它们的公共成员变量和方法。

我在每个类中看到的一种方法是称为 MethodFoo() 的方法。此方法有一个 Common 主体,但每个类都添加了更多内容。例如,对于一个类,它是这样的:

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   **// NON-common stuff just for the method of this class**  //2

   Goto: // bunch of COMMON stuff again   //3
}

所以模板总是第 1 部分和第 3 部分对于这个方法在不同的类中是相同的,但是在 eaxch 类中它的不同之处是第 2 部分......而且不要忘记那个丑陋的 goto 语句:)

所以考虑到这张图片,你认为有没有办法可以将其中的一部分放在我的抽象类中?

4

4 回答 4

7

在您的基类中:

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   DoExtraStuff();

   Goto: // bunch of COMMON stuff again   //3
}

protected abstract void DoExtraStuff();

这样,您必须DoExtraStuff在所有继承类中实现。

该模式被称为模板方法设计模式

于 2012-09-06T15:24:04.890 回答
3

您正在描述模板方法模式

实现者处理DetailStepand 但ToDo对所有人来说都是通用的。

public abstract class Parent
{
    public void ToDo()
    {
        Pre();

        DetailStep();

        Post();
    }

    protected abstract void DetailStep();
}
于 2012-09-06T15:24:47.217 回答
3

这可以使用“模板方法”模式来解决。请参阅此处的“表格 A”:

非虚拟和抽象方法的命名约定

您可以重构所有 MethodFoo 以将常见的东西“拉起”到基类中。向基类添加一个方法“受保护的虚拟 MethodFooInternal”(类似于上面示例的“WalkInternal”)。派生类将在 MethodFooInternal 中实现它们不常见的东西。

要消除 GOTO,您可以在基类中创建条件逻辑来决定是否调用 MethodFooInternal。

private method MethodFoo()
{

   // common stuff ...// wow! no more Goto Statement   //1

    if (this.needToExecuteNonCommonStuff()) {
       **// NON-common stuff just for the method of this class**  //2
        MethodFooInternal();
    }

   // bunch of COMMON stuff again   //3
}

protected abstract void MethodFooInternal();
}
于 2012-09-06T16:07:48.297 回答
1

使其成为受保护的方法,您的派生类可以覆盖它并调用基实现:

protected override void MethodFoo()
{

  base.MethodFood();

   **// NON-common stuff just for the method of this class**  //2
}

这当然需要知道这些步骤需要在派生类中发生的顺序。更好的方法是使用 Austin Salonen 或 Oded 提供的答案。

于 2012-09-06T15:24:48.473 回答