【问题标题】:Liskov Substitution Principle - Am I violating it here?Liskov 替换原则 - 我在这里违反了吗?
【发布时间】:2016-03-25 19:39:10
【问题描述】:

我仍在尝试了解 LSP。据我目前了解,子类/子类型应该能够替换基类/主类型,并且程序应该可以正常工作。

我有以下...

  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? 此外,这是否违反任何其他原则?这可以通过其他方式改进吗?

【问题讨论】:

  • public void showStock() { // Print stocck with getStock() returns Wheat; } void 方法不能“返回小麦”。此外,请务必告诉我们您认为此代码违反 LSP 的原因。
  • 我看不到任何违反 LSP 的行为。您认为它的哪一方面可能是违规行为?
  • Warehouse 是抽象的有什么原因吗?当类已经是泛型时,为每种不同的内容类型创建一个子类似乎是多余的。
  • @MickMnemonic showStock 对于每种类型的股票应该是不同的。所以我需要强制执行。还有其他方法吗?
  • 取决于showStock 应该做什么。您能否通过为每种股票类型(WheatRice 等)实现 toString(),然后从 Warehouse.showStock() 调用该方法来实现相同的目标?

标签: java oop generics design-principles


【解决方案1】:

你所拥有的一切看起来都很好。这里的目标是实现这样您可以执行以下操作:

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

然后可以在wheatrice 上调用Warehouse 类中的方法,无论它们是哪个子类。到目前为止,您的代码可以完美地做到这一点,所以我会说您绝对是在正确的轨道上。

【讨论】:

  • 你可能打算Warehouse&lt;Wheat&gt; wheat = new WheatWH();
  • 对。编辑了我的答案以反映这一点。
  • new WheatWH&lt;Wheat&gt;();new RiceWH&lt;Rice&gt;(); 不可能。这些类没有参数化。
猜你喜欢
  • 2015-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2017-07-04
  • 2012-01-12
  • 1970-01-01
  • 2012-03-16
  • 2021-11-17
相关资源
最近更新 更多