首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将组合超过继承应用于车辆类

将组合超过继承应用于车辆类
EN

Software Engineering用户
提问于 2016-05-07 16:23:59
回答 2查看 1.7K关注 0票数 4

我有一个汽车维修车库程序,它有一个抽象的Vehicle类,它有几个派生类,比如CarMotorCycle,等等。这些派生的车辆要么是燃料,要么是电动汽车。因此,我没有使用FuelCarElectricCarFuelMotorCycleElectricMotorCycle等,而是尝试使用组合来实现它。

现在的问题是,如果它是电动汽车或燃料汽车,我必须随时检查,然后相应地执行as cast (这就像来自c++的reinterpret_cast ),或者必须用try catch包装每个as cast。它增加了代码的复杂性。

另一种选择是删除EnergySource空类,并让每个车辆同时容纳FuelElectric,并且只在ctor中初始化一个,但似乎没有理由让燃料汽车也有一个电动部件(即使该部分为空)。虽然这似乎是三者中最简单的。

对于什么是最好的方法,有什么建议吗?

下面是我目前拥有的UML图:

代码:http://pastebin.com/Rt5HccHC

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-05-07 23:45:41

@radarbob这些成员是被指定的,我没有选择他们。

我的同情。

..。混合动力汽车不应该被允许,而且是不相关的。

好的。那么最好不要在FuelElectric属性中同时使用Vehicle。它“传递了错误的信息”。

..。我看不出在接口中放置属性有什么帮助,我仍然处于第一步。

纵观整个StackExchange世界,我看到了过度使用interfaces (关键词类)的方式。我认为这是一个丰富的错误应用程序和错误理解“代码接口,而不是实现”。

..。最后,您的意思是一个坚实的菱形en.wikipedia.org/wiki/Class_diagram#Relationships。

基于UML的杰西卡·辛普森

..。你还有什么要补充的吗?

是。

VehicleEnergy

中包扎Vehicle

给定如图所示的设计,将一个Vehicle实例传递到具有适当包装方法或属性的VehicleEnergy类中,以查询vehicle类型。但我看不出你怎么能绕过这样的事实,在某个地方,你必须询问物体。

这感觉就像一个很好的分离关注妥协。我不知道这条线上的一连串评论是否是冲突担忧的结果--冲突的症状。

我认为这种混合设计(双关意)表达了独立的方面,然后用一个连贯的接口(非关键字类)表达了它们之间的交互。

可以这样说,Vehicle对象总是可以按原样使用,也可以伪装自己。

哦是的..。我可能会使用工厂的模式,并传入一个enum,以满足车辆的要求.混合动力汽车不会存在枚举成员,因此这将成为一种强类型的通信方式,即“混合动力”是未定义的。

票数 2
EN

Software Engineering用户

发布于 2016-05-07 16:57:37

无论是燃烧还是电动,汽车都有EngineFuel。它们是您的abstract基类。然后,汽车有一个Engine,它不应该关心的引擎是CombustionEngine还是ElectricEngine

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/317816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档