Vermeiden Sie statische Bindungen in Operationen, die Hierarchieargumente verwenden.
Ich habe ein Problem mit der statischen Bindung gefunden.
Meine echte Klasse ist sehr erweitert, daher werde ich mehrere Spielzeugklassen verwenden, um mein Problem auszudrücken.
Wir nehmen an, dass wir die folgende Hierarchie haben.
public class Element{}
public class Element1 extends Element{}
public class Element2 extends Element{}
Ich habe einStock
Klasse, die die verschiedenen @ verwendElement
Spezialisierung definiert durchElement
Hierarchie
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());
}
}
Schließlich habe ich einStockManager
, mit dem ein @ verwaltet werden kaStock
.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
stock.operation(element);
}
}
}
Natürlich wird dieser Code nicht kompiliert, weilStock
definiert keine Methode, die ein @ enthäElement
als Argument. In diesem Fall können wir den Code mit verschiedenen Methoden korrigieren.
Zunächst kann ich eine Methode definieren, die ein @ definierElement
als Eingabeargument, z. B.
public void operation(Element e){
System.out.println("Operation - " + e.getClass().getName());
}
Diese Methode könnte einen Schalter für die Verwaltung der verschiedenen konkreten Elemente definieren Element1
, Element2
). Dies ist jedoch für mich unmöglich, da der Schalter das @ verlet Open / Close-Prinzip, und ich habe viele (viele) konkrete Elemente.
Eine andere Alternative, ich könnte so etwas wie das @ benutzBesuchermuster. Ich könnte das @ sendStock
Objekt zu einem konkreten Element. Und das konkrete Element ist verantwortlich für die Verwendung desStock
Operationen. Die Klasse könnte sich also ändern zu:
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);
}
}
Und dieStockManager
.
public StockManager{
Stock stock;
public StockManager(Stock stock){
this.stock=stock;
}
public void manage(List<Element> elements){
for(Element element: elements){
element.stockOperation(stock);
}
}
}
it @It kann während der Kompilierung der statische Typ der Betonelemente bestimmt werden. Und die dynamische Bindung wird von call the @ in Rechnung gestellstockOperation
Methode des richtigen Betonelements Element1
oderElement2
). JEDOCH !!, ich habe doppelten Code in den konkreten Elementen, und ich werde mehrere konkrete Elemente haben.
Also, ich würde gerne wissen, ob wir ein Musterdesign oder eine bewährte Methode zur Lösung dieses Problems kennen. (Eine andere Alternative ist es vielleicht, Reflection zu verwenden, aber ich möchte es nicht verwenden).