java – 在面向对象设计中处理类型指示符的最佳方法是什么?

参见英文答案 > Object-oriented design: Saving complex objects                                    2个
我们的商业模式需要识别不同类型的车辆.例如,摩托车,船,游艇,农场设备,雪地车,重型卡车,轻型卡车,乘用车和“其他”.

我认为有两种方法可以处理它:创建一个带有几个子类的Vehicle类,比如船,卡车,汽车,并有一个枚举指示实际类型.这可以工作,允许您表示与公共子类共享一些共同特征的车辆.但是它允许你在类中使用不匹配的枚举.

我认为处理它的传统方法是为每种类型设置一个单独的子类,它可以是车辆的子类或车辆的子类.例如,重型和轻型卡车可能是卡车的子类;船和游艇可能是船的子类;雪地摩托车可能是车辆的子类.问题是,它并不能真正代表其他概念.

有没有人对这些场景有任何模式或最佳实践?

彼得

编辑:
该目的的目的是传达关于车辆的信息并且能够以用户友好的方式显示该信息.例如,从数据库提取数据并将其显示在要查看/编辑的屏幕上.

这导致了传统OO手段的另一个缺点,即偏离实际类型的类型指示器,因为它显示了需要执行某种实例的类型并将值转换为用户友好的类型.

(另外,澄清我说的是单个枚举,而不是每个子类的枚举.)

最佳答案
真正的问题

两个“事物”在他们应得自己的阶级之前需要有多么不同?

答案

这完全取决于您将如何使用这些对象.

>你会根据他们拥有的某些属性来比较它们(例如,它是否浮动?)?如果是这样,具有差异化属性的单个类是有意义的.
>您要在界面上显示对象吗?在您的应用程序中,在单个表中显示轻型卡车和重型卡车是否有意义?如果它们不能有意义地存在并显示一个数据集,那么有两个类是有意义的.

这只是两个例子.关键是,如果你创建一个新类,它应该是有用的. Java特别容易过度抽象.

我该怎么办其他的?

其他听起来像一组车辆不是卡车而不是汽车.听起来你想要抓住所有其他车辆并将它们放在一个班级中.为什么不使用Vehicle类?不要创建另一个派生自Vehicle的类,但添加功能.这里适用相同的有用性测试.

>车辆是否足以满足我对所有“其他”车辆的需求?如果没有,我需要创建更多的类.

我接受了你的建议并创建了两个有用的类.现在,我无法区分他们,我拒绝使用instanceof.我该怎么办?

无论你的课程有多抽象,我总能将你的课程实例添加到List< Object>然后将无法区分他们.你不能防弹你的设计.

让我换一种说法 – 如果你将鸡蛋和汽车添加到列表中,然后你需要区分鸡蛋和汽车,那么你的列表就会出现问题,而不是鸡蛋和汽车.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量