我正在尝试学习设计实践和 OOP。我使用 parking 场问题作为示例开始。
我有一个GeneralParkingLot
接口(interface)和一个Vehicle
接口(interface)。
GeneralParkingLot
只有一个函数returnParkingLotSize
,Vehicle
接口(interface)有多个Vehicle属性。
我创建了一个 DowntownParkingLot
类,它扩展了 GeneralParkingLot
并具有其他属性,例如 listOfCars
、availableSlots
等。和一个扩展 Vehicle
类的 Car
类。
我有一个处理传入命令的 HandlerClass
,在该类中我声明了一个 DownTownParkingLot
对象和多个函数来处理命令,因此在每个函数中我只传递DowntownParkingLot
的对象并对其进行操作。
我创建了不同的服务,如 CreateParkingLotObject
、ParkACar
、FreeASlot
等,它们由命令处理程序调用。
我还创建了单元测试来测试我的应用程序。
我的问题是,如果我想扩展我当前的 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/