从超类调用子类方法不是最佳实践吗?

时间:2015-07-23 09:34:17

标签: java c# oop design-patterns

我正在开发一个项目,我们有一个抽象类(BaseConverter),它有一个抽象方法(convert())和几个具体的方法。一个重要的具体方法是invokeConverter(),它基本上会调用子类中实现的convert()方法。

虽然我们的代码正在被其他人审查,但他告诉我,不应该从超类调用子类方法,他告诉这不是最佳实践。以下是我们的课程结构。有人可以告诉我这是不是一种正确的方法吗?

@Named
public abstract class BaseConverter{ 

     @Inject
     private ConversionDriver conversionDriver;//this class is responsible to return the correct subclass object based on the type

     protected abstract String convert(Object toConvert); 

     public String invokeConverter(ConverterType type, Object toConvert){
       conversionDriver.getConverter(type).convert(toConvert);//getConverter() return the subclass object based on the type
     } 
    ....
    ....
}

1 个答案:

答案 0 :(得分:4)

它实际上是GoF的一种名为模板方法的设计模式。但是,你不应该过度应用它,因为它有利于继承而不是组合。

  

在操作中定义算法的骨架,推迟一些   子类的步骤。模板方法允许子类重新定义   算法的步骤而不改变算法的结构。

你会发现这个模式在许多已知的框架和插件中实现。但是,在某些情况下,您应该考虑不同的模式,如策略或装饰器。

例如,虽然策略模式使用委托来改变整个算法,但模板方法使用解除的继承来改变算法的特定部分。策略还在运行时修改单个对象的逻辑,而模板方法通过子类化在编译时修改整个类的逻辑。

关于“最佳实践” - 这是一个有争议的术语。我相信当代码库增长时,应该替换模板方法以支持更好的设计模式,并且需要重构以获得更好的复杂性。

但有时它是满足您需求的最佳解决方案。例如,您可能有doExecute()方法,并希望其他程序员扩展您的类(而不是修改它),因此您可以让它们挂钩代码中提供beforeExecute()方法的部分。如果我们谈论各种对象的组合,成熟的系统可能包括事件调度员功能。

相关问题