3

我有一个像这样的抽象类

public abstract Stuff
{
    public abstract void doStuff();
}

几个类正在扩展 Stuff,覆盖 doStuff()。doStuff() 通常为每个实现执行完全不同的任务,但共享一个共同的部分。

实现这一点的最佳方法是什么?

我不想写这样的东西:

public void doStuff()
{
    doTheCommonPart();
    ...
}

在每个扩展类中。

4

3 回答 3

6

您可以使用模板方法模式

public abstract Stuff
{
    public abstract void doStuff();

    public void doTheCommonPart() {
      // ...
    }

    // Template method
    public final void doIt() {
      doTheCommonPart();
      doStuff();
    }
}

然后,您的客户端类只需调用模板方法doIt()。它将执行公共代码部分,以及抽象方法的具体实现doStuff()

于 2012-09-16T15:50:56.910 回答
5

任何一个:

  1. 将公共代码放在类中的protected方法中,Stuff并从 ; 的每个实现中调用它doStuff。或者

  2. 将通用代码添加到您的抽象Stuff类并调用另一个抽象方法。

例如(1)

public abstract Stuff  
{
    public abstract void doStuff();

    protected void commonCode() 
    {
      //...
    }
}

或 (2)

public abstract Stuff
{
    public void doStuff() 
    {
      // Do the common stuff initially...
      // ...

      // Then call the subclass implementation
      doRealStuff();
    }

    public abstract void doRealStuff();
}
于 2012-09-16T15:54:09.010 回答
2

你可以这样定义,类似于模板方法设计模式

public abstract Stuff
{
    public abstract void doSpecificStuff();

    public void doStuff()
    {
        doCommonStuff();
        doSpecificStuff();
    }
}
于 2012-09-16T15:51:37.860 回答