我发现了一个关于静态绑定的问题。
我的真实课程非常扩展,所以我将使用几个玩具课程来表达我的问题。
我们假设我们有以下层次结构。
public class Element{}
public class Element1 extends Element{}
public class Element2 extends Element{}
我有一个Stock
使用不同的类Element
专业化定义为Element
等级制度。
public class Stock{
public void operation(Element1 e1){
System.out.println("Operation - " + e1.getClass().getName());
}
public void operation(Element2 e2){
System.out.println("Operation - " + e2.getClass().getName());
}
}
最后,我有一个StockManager
它允许管理Stock
.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
stock.operation(element);
}
}
}
当然,这段代码无法编译,因为Stock
没有定义一个方法,其中包括Element
作为论证。在这种情况下,我们可以使用不同的方法修复代码。
首先,我将能够定义一个方法来定义Element
作为输入 arg,例如
public void operation(Element e){
System.out.println("Operation - " + e.getClass().getName());
}
该方法可以定义一个开关来管理不同的具体元素(Element1
, Element2
)。然而,这对我来说是不可能的,因为开关违反了开/关原理,而且我有很多(很多)具体元素。
另一种选择,我可以使用类似的东西访客模式。
我可以发送Stock
对象为具体元素。具体元素将负责使用Stock
运营。因此,该类可以更改为:
public abstract class Element{
public abstract void stockOperation(Stock stock);
}
public class Element1 extends Element{
public abstract void stockOperation(Stock stock){
stock.operation(this);
}
}
public class Element2 extends Element{
public abstract void stockOperation(Stock stock){
stock.operation(this);
}
}
And the StockManager
.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
element.stockOperation(stock);
}
}
}
它允许在编译时确定具体元素的静态类型。并且动态绑定将负责调用stockOperation
正确的具体元素的方法(Element1
or Element2
)。但是!!,我在具体元素中有重复的代码,并且我将有几个具体元素。
因此,我想知道我们是否知道解决此问题的任何模式设计或任何最佳实践。
(另一种选择,可能使用反射,但我不想使用它)。