2016-03-25 24 views
0

我仍然試圖理解LSP。據我瞭解,到目前爲止,子類/子類型應該能夠替代Baseclass/Main類型,程序應該完好無損地工作。Liskov替代原則 - 我在這裏違反了嗎?

我有以下...

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?如果沒有,那麼會在上面的progream中違反LSP? 此外,這是否違反任何其他原則?這可以通過其他方式進行改進嗎?

+0

'public void showStock(){//打印stocck與getStock()返回小麥; }一個無效的方法不能「返回小麥」。此外,告訴我們爲什麼您認爲此代碼違反了LSP很重要。 –

+1

我看不到任何違規的LSP。你認爲它的哪個方面可能是違規行爲? –

+2

「倉庫」是抽象的嗎?當類已經是通用類時,爲每種不同內容類型創建子類似乎過多。 –

回答

1

你有什麼看起來非常好。這樣做的目的是將有這樣一種實現,你可以這樣做:

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

然後能夠調用從Warehouse類的方法上wheatrice不管它們是子類。你到目前爲止的代碼完美無缺,所以我會說你絕對是在正確的軌道上。

+1

您可能需要倉庫小麥=新WheatWH();'等 – beresfordt

+0

正確。編輯我的答案以反映這一點。 – NAMS

+0

'new WheatWH ();''''和'RiceWH ();'不可能。這些類不是參數化的。 –