2016-03-25 17 views
0

私はまだLSPを理解しようとしています。私がこれまで理解してきたことから、サブクラス/サブタイプはBaseclass/Mainタイプを置き換えることができ、プログラムはそのまま動作するはずです。リスコフ代理原則 - 私はここに違反していますか?

私は、次の...

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 { 
     .... 
    } 

それはLSPに違反していがありますか?そうでない場合は、上記のプログラムでLSPに違反するものは何ですか? さらに、これは他の原則に違反していますか?他の方法でこれを改善できますか?

+0

'public void showStock(){// getStock()でstocckを表示すると小麦が返されます。 } 'voidメソッドは"小麦を返す "ことはできません。また、このコードがLSPに違反していると思われる理由を教えてください。 –

+1

私はLSPの違反を見ることができません。それのどの面が違反と思われますか? –

+2

'Warehouse'が抽象的な理由はありますか?クラスが既に一般的である場合、異なるコンテンツタイプごとにサブクラスを作成することは過度に思われます。 –

答えて

1

あなたが持っているものは完璧に上手です。

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

そしてかかわらず、彼らはそのサブクラスのwheatriceWarehouseクラスからメソッドを呼び出すことができる:ここでの目標は、あなたのような何かができるというような実装を持っているだろう。あなたが今までに持っていたコードはこれを完全に行っているので、あなたは間違いなく正しい道にいると言います。

+1

おそらく '倉庫小麦=新しいWheatWH();'等 – beresfordt

+0

右です。それを反映するために私の答えを編集しました。 – NAMS

+0

'new WheatWH ();'と '新しいRiceWH ();'は不可能です。これらのクラスはパラメータ化されていません。 –

関連する問題