Java 如何对车辆进行分类-继承与接口
我正在尝试对车辆进行分类,但我不确定什么是最好的方法 为什么我感到困惑? 仔细想想,车辆可以通过多种方式进行分类: 1) 车辆性质:陆地车辆、船只和飞机。 2) 另一种分类方式:机动车辆和非机动车辆,如拖拉机(非机动且仅与卡车相连)、卡车等。 3) 车辆装载性质:车辆可以装载也可以不装载 让我举一个例子: 车辆->陆上车辆->动力/非动力->可装载/非装载 如果你看到了,我正在创建许多子类,但是除了属性差异之外,它的用途是什么,它是可加载的还是不可加载的。我也可以使用接口来实现这一点。为车辆提供可装载?供电接口,允许装载 例如: 车辆->陆地车辆->拖拉机 LandVehicle将实现诸如iPowered和isLoadable之类的接口,这些接口将被拖拉机覆盖为false和true resp 我知道继承是为了“isa”关系,接口是为了“can do”,但这在这里有什么不同,因为它可以互换使用Java 如何对车辆进行分类-继承与接口,java,inheritance,design-patterns,interface,Java,Inheritance,Design Patterns,Interface,我正在尝试对车辆进行分类,但我不确定什么是最好的方法 为什么我感到困惑? 仔细想想,车辆可以通过多种方式进行分类: 1) 车辆性质:陆地车辆、船只和飞机。 2) 另一种分类方式:机动车辆和非机动车辆,如拖拉机(非机动且仅与卡车相连)、卡车等。 3) 车辆装载性质:车辆可以装载也可以不装载 让我举一个例子: 车辆->陆上车辆->动力/非动力->可装载/非装载 如果你看到了,我正在创建许多子类,但是除了属性差异之外,它的用途是什么,它是可加载的还是不可加载的。我也可以使用接口来实现这一点。为车辆提供
解决这类问题的最佳方法是什么。解决这类问题的最佳方法是使用亲吻规则:保持简单愚蠢强> 在这种情况下,对分类中的“主要”部分使用继承,对分类中的“次要”部分使用接口。这是因为Java只允许单一继承(主要部分),但对类可以实现的接口数量没有限制 但是,如果您不想为每个类别添加行为,只想对
车辆进行一些描述,请通过以下方式使用合成:
public class Vehicle {
private List<VehicleDescription> descriptions = new ArrayList<VehicleDescription>();
public void addDescription(VehicleDescription description) {
descriptions.add(description);
}
public boolean hasDescription(VehicleDescription description) {
return descriptions.indexOf(description) > -1;
}
public enum VehicleDescription {
Land, Water, Air, Powered, NonPowered, Loadable, NonLoadable
}
公共级车辆{
私有列表描述=新建ArrayList();
公共无效添加说明(车辆说明说明){
说明。添加(说明);
}
公共描述(车辆描述描述){
返回说明。indexOf(description)>-1;
}
公共枚举车辆描述{
陆上、水上、空气、动力、非动力、可装载、非装载
}
您可以根据需要在车辆类中添加任意多个“描述”类型枚举列表(这样您就可以防止同时执行可加载和不可加载的操作),并且您只需要几个类
总之,尽可能使用合成。这些车辆的性能或属性是否不同
属性:用于构建具有不同属性的不同类型的车辆
功能:使用接口提供不同的功能,并定义以添加功能
如果您需要两者的混合,请正确使用Builder
+Decorator
模式
您可以用于车辆
类中的功能列表。车辆
类将维护列表
请看以下示例:
组合与您的情况更匹配。想象您的车辆由点火系统、燃油系统、变速器、座舱等部件组成。您可以看到许多类型的车辆都有独特的部件:2、3、4轮、履带、悬停/前进档、后轮驱动、全轮驱动/内燃机(燃油系统)或电动(电气系统).继承将使您的体系结构非常受限,并且很难修改
使用composition,您甚至不需要对车辆进行分类。只需将组件添加到车辆中。如果您想使用筛选器按参数(如车轮数量、驾驶类型)搜索车辆,您可以使用接受条件的方法实现ISearchable接口,并查找其车辆组件,以确定是否所有组件都符合条件.解决这些问题的最佳方法是使用组合而不是继承。有人可能会对您的特定问题给出答案,但请参见:谢谢WW。我认为组合在这方面对我没有帮助,或者如果真的有帮助,我可能需要重新考虑。多属性+多属性组合==装饰模式。您“我们必须解释它们在行为和属性上的差异……水上飞机怎么办?