gpt4 book ai didi

java - 不同数据类型的里氏替换原理

转载 作者:行者123 更新时间:2023-12-01 13:16:32 25 4
gpt4 key购买 nike

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

最佳答案

您在这里面临的问题是您想要抽象两个信息——一种常见的“过期”信息。问题是这个抽象对于代码来说是未知的,它目前只存在于你的头脑中:)

它目前以两种风格实现:整数和日期(虽然我不知道这个 Integer 是什么意思?它是年份计数吗?...自 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)的含义。

关于java - 不同数据类型的里氏替换原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22423938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com