java - 使用 OOPS 扩展已经编写的类

标签 java oop inheritance design-patterns interface

我正在尝试学习设计实践和 OOP。我使用 parking 场问题作为示例开始。

我有一个GeneralParkingLot 接口(interface)和一个Vehicle 接口(interface)。 GeneralParkingLot只有一个函数returnParkingLotSizeVehicle接口(interface)有多个Vehicle属性。

我创建了一个 DowntownParkingLot 类,它扩展了 GeneralParkingLot 并具有其他属性,例如 listOfCarsavailableSlots 等。和一个扩展 Vehicle 类的 Car 类。

我有一个处理传入命令的 HandlerClass,在该类中我声明了一个 DownTownParkingLot 对象和多个函数来处理命令,因此在每个函数中我只传递DowntownParkingLot 的对象并对其进行操作。

我创建了不同的服务,如 CreateParkingLotObjectParkACarFreeASlot 等,它们由命令处理程序调用。

我还创建了单元测试来测试我的应用程序。

我的问题是,如果我想扩展我当前的 parking 场以获得额外的功能,比如多层属性,或者如果我现在想处理多个 parking 场而不是一个,那么扩展我的 GeneralParkingLot 类或 DowntownParkingLot 类。我还阅读了有关适配器和装饰器模式的内容,但我认为当我从一开始就遵循特定的设计模式时,这些模式很有用,在我的例子中,我没有遵循任何特定的模式,所以扩展我的代码的最佳方式是什么。我问这个是因为有时我们会遇到一个类,它不是根据任何设计模式制作的,而是在多个地方使用(比如很多 API 等),那么扩展此类代码的最佳方法是什么。从头开始重构是唯一的选择吗?还是创建继承自旧类的新类?最好的方法是什么?另外,我想尽可能多地使用已经创建的单元测试,而不是再次重写相同的测试用例。

最佳答案

在您的情况下,最顶层的类是一个接口(interface),因此您不能直接添加属性。

解决您的问题的一种方法是创建一个实现 GeneralParkingLot 接口(interface)的最顶层实现类:

public abstract CommonParkingLot implements GeneralParkingLot {
     // add your missing attributes here
     protected int floorNo;
}

(如果您只想添加属性而不为 GeneralParkingLot 提供一些默认实现,那么您可以省略 implements 部分)

然后让您的实现类扩展此 CommonParkingLot:

public class DowntownParkingLot extends CommonParkingLot implement GeneralParkingLot {
     // Now all missing attributes are accessible here
}

对于缺少的功能,default 功能接口(interface)应该派上用场。 (关键字是指定的语言),您可以根据需要向具有默认主体的 GeneralParkingLot 接口(interface)添加更多功能。

还有一点,您当前的实现有点局限于 DowntownParkingLot,因为您没有向界面添加通用功能。我建议您稍微重构一下 HandlerClass 类:

public interface GeneralParkingLot {
    int returnParkingLotSize();
    ParkingLotObject createParkingLotObject();
    boolean parkACar();
    int freeASlot();
    default public void parkMultipleCar() {
         throws new UnsupportedOperationException();
    }
}

现在,在您的 HandlerClass 中,应该对 GeneralParkingLot 而不是 DowntownParkingLot 进行操作。

通过这样做,您可以在不更改代码的情况下添加更多 GeneralParkingLot

关于java - 使用 OOPS 扩展已经编写的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50839728/

相关文章:

java - 奇怪的计数器 - HackerRank

java - 用于确定字符串是否为单个重复字符的正则表达式

Java ImageIO.read(文件与 URL)

python - 递归搜索嵌套字典并将函数应用于搜索键 :value pair

Python继承-实例没有属性

C++:虚拟指针的原型(prototype)

java - 获取 IBM Notes 中某个日期范围内的文档

java - OOP:创建实用程序类或扩展公共(public)基础对象?

java - 使用 PageFactory.initElements 在父类中初始化子类 Web 元素

javascript - 关于范围、node.js 和express 的问题