【发布时间】:2018-09-22 23:02:11
【问题描述】:
我已经为此苦苦挣扎了一段时间。我想定义一组有限的类型,其中一些是其他类型的子类型,其中每种类型都由其属性的值定义。然后这些类型将用于访问它们的属性,并通过工厂方法创建它们的实例。
现在可能没有多大意义,所以假设我有这段代码。
abstract class Car {
final int seats;
final int maxSpeed;
...
}
abstract class DeliveryCar extends Car {
final int maxload;
...
}
现在我想要拥有诸如 FamilyCar 和 SportsCar 的超类型 Car 和 HeavyTruck 的超类型 DeliveryCar 的类型,每种类型都有多个实例,困难的部分是实例变量不应该真的是“实例”变量 - 它们应该对每个 FamilyCar 具有相同的值,然后对于每个 SportsCar 和每个 HeavyTruck 的其他值应该具有相同的值,并且它们应该可以在没有实例的情况下访问。所以例如我希望能够写:
System.out.print("Sports cars' max. speed: " + SportsCar.maxSpeed);
我想到但没有解决的一些事情:
- 静态值,但 java 不允许覆盖静态成员
- 枚举,但在 java 中没有枚举的子类,因此每个不是
DeliveryCar的Car都必须有maxload和可能的其他成员 - 模拟枚举,类似这样:
class CarType {
final int seats;
final int maxSpeed;
...
static final CarType FAMILY_CAR = new CarType(5, 180);
static final CarType SPORT_CAR = new CarType(2, 280);
...
CarType(int seats, int maxSpeed) {
...
}
class DeliveryCarType extends CarType {
final int maxload;
...
static final DeliveryCarType HEAVY_TRUCK = new DeliveryCarType(3, 150, 500)
...
DeliveryCarType(int seats, int maxSpeed, int maxLoad) {
...
}
它会做我需要的,但它也将是有效的,比如DeliveryCar.SPORTS_CAR。
我不确定我想要实现的设计中是否存在一些根本性缺陷,但这让我非常烦恼,因为我似乎无法解决仅通过可覆盖的静态成员即可解决的问题,我认为一些其他语言(例如 Objective-C)实现。
编辑:我还阅读了this 讨论(以及其他内容),但那里的任何想法似乎都无法解决我的问题。
【问题讨论】:
-
您想对这些值使用多态性吗?例如:
List<? extends Car> listOfAnyCars ...; for(Car car : listOfAnyCars) System.out.println(car.maxSpeed);应该打印不同的值吗?另外Car.maxSpeed和SportsCar.maxSpeed应该打印不同的值吗? (这两种结果都不可能) -
@xtratic 只要汽车属于不同的子类型,它就应该打印不同的值。所以所有
FamilyCar的最大值都相同。速度,但不同于最大速度。SportsCars的速度。我希望这是有道理的。 Car.maxSpeed 不代表我要建模的任何内容。它的值可以用作子类型的默认值,可以覆盖它。 -
标签: java inheritance enums static singleton