我的程序中的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。 有什么想法吗?
答案 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
)。