Liskov Substitution Principle不同的数据类型

时间:2014-03-15 12:41:20

标签: java oop types liskov-substitution-principle

我的程序中的LSP有问题。我有一个抽象的基类和两种不同类型的产品,一个是食品,另一个是电子设备。我需要创建一个方法来返回这些产品的expirationDate / Warranty。问题是一个是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。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您在这里遇到的问题是,您希望将两种信息抽象为一种常见的“过期”信息。问题是这个抽象是代码所不知道的,它目前只存在于你的头脑中:)

它目前以两种方式实现:整数和日期 (虽然我不知道这个整数是关于什么的?这是一年的数量吗?......自1990年以来的lottory赢家数量?我不知道。)

我建议为这个抽象添加一个新的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)。