我有一个像这样的抽象类
public abstract Stuff
{
public abstract void doStuff();
}
几个类正在扩展Stuff,重写doStuff()。 doStuff()通常为每个实现执行完全不同的任务,但共享一个共同的部分。
实现这个的最好方法是什么?
我不想写像:
public void doStuff()
{
doTheCommonPart();
...
}
在每个扩展课程中。
答案 0 :(得分:6)
您可以使用Template Method Pattern:
public abstract Stuff
{
public abstract void doStuff();
public void doTheCommonPart() {
// ...
}
// Template method
public final void doIt() {
doTheCommonPart();
doStuff();
}
}
然后,您的客户端类只需调用模板方法doIt()
。它将执行公共代码部分,以及抽象方法doStuff()
的具体实现。
答案 1 :(得分:4)
或者:
将公共代码放在protected
类的Stuff
方法中,并从doStuff
的每个实现中调用它;或
将公共代码添加到抽象Stuff
类并调用另一个抽象方法。
E.g。 (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();
}
答案 2 :(得分:2)
您可以像这样定义它,类似于template method design pattern:
public abstract Stuff
{
public abstract void doSpecificStuff();
public void doStuff()
{
doCommonStuff();
doSpecificStuff();
}
}