【问题标题】:Liskov Substitution Principle different data typesLiskov 替换原则不同的数据类型
【发布时间】:2015-11-19 19:05:30
【问题描述】:

我的程序中的 LSP 有问题。我有一个抽象的基类和两种不同类型的产品,一种是食品,另一种是电子设备。我需要创建一个方法来返回这些产品的到期日期/保修。问题是一个是 Date 类型,另一个(保修)是 Int 类型... 你知道如何制作一个同时满足这两种数据类型的方法吗?不使用 switch/if 语句,因为这将违反 OCP。

private static void printExpirationDateStatistics(List<Product> foodProducts) {
for (Product product : foodProducts) {
  System.out.println(product.getExpirationDate());
}

}

有没有什么方法可以修改这个函数来处理食品和电子产品,这样我就不必为每个新产品添加另一种方法?

这些是来自基类的方法

    public Date getExpirationDate() {
    return expirationDate;
  }

  public void setExpirationDate(Date expirationDate) {
    this.expirationDate = expirationDate;
  }

  public int getWarranty() {
    return warranty;
  }

  public void setWarranty(int warranty) {
    this.warranty = warranty;
  }

我尝试制作一种 getValidity 方法,但问题是对于食物它应该返回 Date,而对于电子产品应该返回 Int。 有什么想法吗?

【问题讨论】:

  • 这与 Liskov 替换无关。问题不在于子类型没有基类型的属性,而在于您有两个不同的运算符,您在一般操作时遇到了麻烦。

标签: java oop types liskov-substitution-principle


【解决方案1】:

您在这里面临的问题是,您想通过两个信息抽象出一种常见的“到期”信息。问题是代码不知道这种抽象,它目前只存在于你的脑海中:)

目前以 2 种风格实现:整数和日期 (虽然我不知道这个 Integer 是关于什么的?它是按年计算的吗?......自 1990 年以来的彩票中奖者数量?我不知道)。

我建议为这个抽象添加一个新的Interface,例如

public interface Expiration<T> {
    T getExpiration();
}

在这种情况下,您的两个基类可以实现Expiration&lt;Date&gt;Expiration&lt;Integer&gt;,您可以将验证逻辑建立在此基础上。比如像:

 public boolean isValid(Expiration<Date> potentialyExpired) {
     final Date expirationDate = potentialyExpired.getExpiration();
     final Date now = new Date();
     return expirationDate.before(now);
 }

只有当您可以访问相关课程时才能做到这一点。 这种抽象是否足够,还是您需要更多?

您可能希望对不同类型的Expiration 进行抽象,这样您就不需要同时拥有它们并在某个时候将它们统一起来。但要决定那种事情,需要更多地了解另一种类型(Integer 的含义)。

【讨论】:

  • 整数是保修期,以年为单位,抱歉没有提及。我会尝试你的想法并回复。谢谢!
  • 如果以年为单位并且您知道保修开始的日期,您可以将其统一为Date 并计算到期日期。这将摆脱您当前需要处理的不同类型。
  • 实际上它通过在我的类中实现接口并覆盖 getExpiration() 方法来工作。我只是打电话: public Integer getExpiration(){ return保修; } 或 public Date getExpiration(){ return expirationDate; } xD
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2019-09-27
  • 2014-06-05
相关资源
最近更新 更多