2016-03-25 93 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 ();'不可能。这些类不是参数化的。 –

相关问题