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).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage