我正在使用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
    }
}


当然,ConfigAConfigB在哪里扩展AbstractConfig

我通过自动装配来使用ConcreteVisitor的bean实例,如下所示:

@Autowired
private AbstractVisitor visitor;


问题是,当我调用visitor.visit(config)时,其中configConfigA的实例,它将引发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/

10-10 04:36