父子之间的多态性 class

Polymorphism between a parent and a child class

我正在使用访问者模式进行开发,如下所示:

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,将调用父方法。

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;