父子之间的多态性 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
}
}
其中,当然 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
,将调用父方法。
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;
我正在使用访问者模式进行开发,如下所示:
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
,将调用父方法。
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;