0

我的程序中的 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。有任何想法吗 ?

4

1 回答 1

1

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

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

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

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

在这种情况下,您的两个基类可以实现Expiration<Date>Expiration<Integer>并且您可以将验证逻辑基于此。例如像:

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

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

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

于 2014-03-15T12:58:19.830 回答