2016-03-25 9 views
0

Ich versuche immer noch, LSP zu verstehen. Nach dem, was ich bisher verstanden habe, sollten Subklassen/Subtypen in der Lage sein, Baseclass/Main-Typ zu ersetzen, und das Programm sollte intakt funktionieren.Liskov Substitutionsprinzip - verletze ich es hier?

Ich habe folgendes ...

abstract class Warehouse<T> { 
     private StockLoader<T> loader; 
     private List<T> stock; 

     protected setStockLoader(StockLoader loader) { 
      this.loader = loader; 
     } 

     protected List<T> getStock() { 
      return stock; 
     } 

     public void load() { 
     stock = loader.load(); 
     } 

     abstract showStock(); 
    } 

class WheatWH extends Warehouse<Wheat> { 
    @Override 
    public void showStock() { 
     // Print stocck with getStock() returns Wheat; 
    } 
} 

class RiceWH extends Warehouse<Rice> { 
    @Override 
    public void showStock() { 
     // Print stocck with getStock() returns Rice; 
    } 
} 


    interface List<T> StockLoader<T>() { 
     public List<T> load();  
    } 

    class PlainStockLoader implements StockLoader<Wheat>{ 
     public List<Wheat> load() { 
      //Code 
     } 
    } 

    class Rice { 
     ..... 
    } 

    class Wheat { 
     .... 
    } 

Ist es LSP verletzen? Wenn nicht, was würde LSP im obigen Progress verletzen? Verstößt dies auch gegen andere Prinzipien? Kann dies auf andere Weise verbessert werden?

+0

'public void showStock() {// Druckstack mit getStock() gibt zurück Weizen; } 'Eine ungültige Methode kann nicht" Weizen zurückgeben ". Außerdem ist es wichtig, uns mitzuteilen, warum Sie glauben, dass dieser Code gegen den LSP verstößt. –

+1

Ich kann keine Verletzungen von LSP sehen. Was für einen Aspekt davon könnte Ihrer Meinung nach eine Verletzung sein? –

+2

Gibt es einen Grund, warum 'Warehouse' abstrakt ist? Das Erstellen einer Unterklasse für jeden unterschiedlichen Inhaltstyp erscheint übermäßig, wenn die Klasse bereits generisch ist. –

Antwort

1

Was Sie haben, sieht perfekt aus. Das Ziel wäre eine Implementierung zu haben, so dass Sie so etwas wie tun könnte:

Warehouse<Wheat> wheat = new WheatWH(); 
Warehouse<Rice> rice = new RiceWH(); 

Und dann in der Lage sein, Methoden aufrufen aus der Warehouse Klasse auf wheat und rice unabhängig von der Unterklasse sie sind. Der Code, den du bisher gemacht hast, macht das perfekt, also würde ich sagen, dass du definitiv auf dem richtigen Weg bist.

+1

Sie haben wahrscheinlich beabsichtigt, Lager Weizen = neue WheatWH(); etc – beresfordt

+0

Right. Bearbeitete meine Antwort, um das zu reflektieren. – NAMS

+0

'neue WheatWH ();' und 'neue RiceWH ();' nicht möglich. Diese Klassen sind nicht parametrisiert. –

Verwandte Themen