从 super class 调用 sub class 方法不是最佳实践吗?

Calling the sub class method from super class isn't best practice?

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

当我们的代码正在被其他人审查时,他告诉我们,不应该从 superclass 调用 subclass 方法,他说这不是最佳实践。下面是我们的 class 结构。有人可以告诉我这是否不是正确的做法吗?

@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
     } 
    ....
    ....
}

其实是GoF的一种叫做Template Method的设计模式。但是,您不应该过度应用它,因为它更倾向于继承而不是组合。

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

您会发现许多已知的框架和插件都实现了这种模式。但是,在某些情况下,您应该考虑不同的模式,例如 Strategy 或 Decorator。

例如,虽然策略模式使用委托来改变整个算法,但模板方法使用名誉扫地的继承来改变算法的特定部分。 Strategy也在运行时修改了单个对象的逻辑,而Template Method在编译时通过subclass修改了整个class的逻辑。


关于 "best practice" - 这是一个有争议的术语。我相信当代码库增长并且需要重构以获得更好的复杂性时,模板方法应该被替换为更好的设计模式。

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