我正在使用Visitor模式进行开发,如下所示:
public abstract class AbstractVisitor {
public void visit(AbstractConfig config) {
throw new NotImplementedException();
}
}
由...继承
@Component
public class ConcreteVisitor extends AbstractVisitor {
public void visit(ConfigA config) {
// Do something
}
public void visit(ConfigB config) {
// Do something
}
}
当然,
ConfigA
和ConfigB
在哪里扩展AbstractConfig
。我通过自动装配来使用
ConcreteVisitor
的bean实例,如下所示:@Autowired
private AbstractVisitor visitor;
问题是,当我调用
visitor.visit(config)
时,其中config
是ConfigA
的实例,它将引发NotImplementedException。现在,我将所有可能的抽象方法声明为
AbstractVisitor
,但是还有另一种更可取的解决方案吗?我的意思是,具体的访问者可以定义任何与父级抽象方法的参数同义的方法。先感谢您。
最佳答案
public void visit(AbstractConfig)
与public void visit(ConfigA)
不同。如果您有AbstractConfig
并调用visit
,则将调用parent的方法。
AbstractConfig con = new ConfigA();
visitor.visit(con); //NoImplementedException (parent's method)
ConfigA = conA = new ConfigA();
visitor.visit(conA); //OK, ConcreteVisitor's method
您必须为
AbstractConfig
的每个具体实现声明每个方法。使用访问者的界面代替:public interface Visitor {
public void visit(ConfigA config);
public void visit(ConfigB config);
}
@Component
public class ConcreteVisitor implements Visitor {
@Override
public void visit(ConfigA config) {
// Do something
}
@Override
public void visit(ConfigB config) {
// Do something
}
}
@Autowired
private Visitor visitor;
关于java - 父级和子级之间的多态性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36542358/