当有一类汽车时,应该是可转换汽车的汽车吗?

时间:2012-04-22 23:19:23

标签: oop uml ooad

比如说,如果在我们的对象设计中,已经有一个Car类,现在有一些可转换的汽车对象。

我们可以定义另一个类Convertible和子类Car,但是我们稍后会创建一个类FourWheelDrive的类,它也是Car的子类,稍后,如果我们的FourWheelDrive也是Convertible,那么我们该如何处理呢?

上面的设计与其他设计相比如何,isConvertible类中的Car布尔值,isFourWheelDrive类中的Car布尔值,就像Car类的标志或属性一样。因此,在这种情况下,我们不会定义额外的类。

更新:在现实生活中的例子,在我们的项目中,有一个Credential类存储用户的信息:user_id,encrypted_pa​​ssword,email_address等。当我们允许登录时通过Facebook,Gmail,雅虎,MySpace(使用JanRain),同事建议添加FacebookCredentialGmailCredentialYahooCredential,所有这些类都是Credential的子类。我有点不知所措,因为有很多类,当你看到一个方法时,你必须看看子类是否重写它或者它是基类的方法。我本来只是使用代码来告诉它是哪个提供商(Facebook,Gmail等),并使用此提供程序代码来执行相应的操作。 (例如,某些提供商已经验证了电子邮件地址,有些则没有)。所以我只是不知道我的同事的方法是否更合适或更复杂。

4 个答案:

答案 0 :(得分:2)

您可能希望使用http://en.wikipedia.org/wiki/Strategy_pattern采用不同的方法 您可以为不同类型的汽车定义不同的行为,因此您没有很多子类。

答案 1 :(得分:1)

您暗示您使用的语言不支持多重继承。语言是否支持接口?你可以有一个基础抽象类Car。 (摘要因为从来没有构建“汽车”,而是构建汽车的特定实现。)然后继承抽象基类的类的实例可以实现公共接口:

  • IConvertible
  • IFourWheelDrive
  • IHybrid
  • 等......

这个想法是抽象基类最简单地定义 的内容。接口定义了它的类型,并且肯定会有重叠。这些接口将包含特定于该类型的操作和属性。 (IConvertible将具有不可转换的不具有的属性和方法,与IHybrid相同,等等。)然后,具体实现可以为整个事物添加自己独特的天赋。

如你所知,这是一个人为的例子。所以这都是猜想。但对于这个特定的理论实现,我会选择接口。

答案 2 :(得分:1)

除了您对可转换的四轮驱动汽车的关注外,请考虑以下因素:

  • 所有可转换车都是?
  • 是否所有车辆都配有四轮驱动汽车?

对我来说,这些问题都指出了汽车的属性并没有定义类型。从某种意义上说,它们与颜色或门的数量等没有区别。

答案 3 :(得分:0)

这基本上归结为一个问题,你是否需要/想要根据它是可转换的还是四轮驱动来改变类的功能。例如,如果您需要/希望为敞篷车提供raise_toplower_top,为四轮驱动提供lock_hubsunlock_hubs,那么您非常需要使用继承来添加具有这些的类。在这种情况下,那么是的,敞篷四轮驱动车辆将继承敞篷车和四轮驱动车级的机会非常公平。因此,如果你在C ++中这样做,那些类应该可能从automobile(或者你的基类命名)实际上继承,而在类似Java的东西中,它们几乎需要是接口而不是比上课。

另一方面,如果您只需要能够找出特定车辆是否可转换和/或4轮驱动,那么该类中的简单布尔(或枚举)字段应该是完全足够。