gpt4 book ai didi

java - 如何设计一个具有基类中没有的功能的子类?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:36 26 4
gpt4 key购买 nike

例如,假设我有一个类 Vehicle,我希望有一个子类 ConvertibleVehicle,它有额外的方法,例如 foldRoof()、turboMode()、foldFrontSeats() 等。我希望实例化如下

Vehicle convertible = new ConvertibleVehicle()

所以我仍然可以访问 openDoor()、startEngine() 等常用方法。我如何设计这样的解决方案?

澄清一下我的两个初始解决方案,但我都不满意:

  1. 具有虚拟方法 foldRoof()、turboMode()、foldFrontSeats(),我仅在 ConvertibleVehicle 中重写这些方法,让它们在其他子类中不执行任何操作
  2. 拥有抽象方法 foldRoof()、turboMode()、foldFrontSeats() 并强制每个子类提供一个实现,即使它在除 ConvertibleVehicle 之外的所有实例中都是空白

上面的内容看起来有点令人费解,因为它们都污染了基类,因为我添加了越来越多的子类,每个子类都有自己独特的功能

在阅读了一些回复后,我的设计中可能存在某种基本缺陷。假设我有一个 VehicleFleet 类,它接收车辆并指示它们按如下方式驾驶:

public VehicleFleet(Vehicle[] myVehicles) {

for (int i=0; i < myVehicles.length; i++) {
myVehicles[i].drive();
}
}

假设这适用于 Vehicle 的数十个子类,但对于 ConvertibleVehicle 我还想在驾驶前折叠车顶。为此,我将 VehicleFleet 子类化如下:

public ConvertibleVehicleFleet(Vehicle[] myVehicles) {

for (int i=0; i < myVehicles.length; i++) {
myVehicles[i].foldRoof();
myVehicles[i].drive();
}
}

这给我留下了一个困惑的函数 foldRoof() 卡在基类中,它实际上并不属于它,它仅在 ConvertibleVehicle 的情况下被覆盖,而在所有其他情况下什么都不做。该解决方案有效但似乎非常不优雅。这个问题是否有助于更好的架构?

我正在使用 Java,尽管我希望可以找到一个通用的解决方案,它可以在任何面向对象的语言中工作,并且我不需要依赖于特定于语言的怪癖

最佳答案

任何使用 Vehicle 的对象都不应该知道 ConvertibleVehicle 及其专用方法。在适当的松耦合面向对象设计中,Driver 只会知道 Vehicle 接口(interface)。 Driver 可能会在 Vehicle 上调用 startEngine(),但 Vehicle 的子类需要覆盖 startEngine() 来处理不同的实现,例如转动 key 还是按下按钮。

考虑查看以下两个链接,它们应该有助于解释这个概念: http://en.wikipedia.org/wiki/Liskov_substitution_principle http://en.wikipedia.org/wiki/Open/closed_principle

考虑发布一个您认为会导致您在此处描述的困境的现实世界问题,并且有人会非常乐意展示更好的方法。

关于java - 如何设计一个具有基类中没有的功能的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758340/

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