【发布时间】:2015-07-23 09:34:17
【问题描述】:
我正在做一个项目,我们有一个抽象类 (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
}
....
....
}
【问题讨论】:
-
你没有调用子类方法。您只是在调用超类的重写方法。这就是首先使用抽象方法的原因之一。我不知道这会是什么不好的做法。
-
@Codebender,谢谢.. 是的,我用相同的答案证明了这一点,但那个人不相信并要求我们改变结构。
-
问那个人......让他解释一下,因为他很了解你的代码。
-
我认为问题可能在于
invokeConverter似乎完成了静态方法而不是实例方法的工作,因为它检索了一些对象来进行转换。这意味着基本上必须创建一个子类实例,然后根据该类型创建另一个实例。模板方法应该直接与当前实例一起工作,假设它是“正确的实例”,并且静态方法应该选择正确的子类。 -
@RealSkeptic,这是我在阅读模板模式后所做的确切更改。我正在将
private ConversionDriver conversionDriver;移动到调用类,以便为当前实例调用convert()。非常感谢。
标签: java c# oop design-patterns