比如说,如果在我们的对象设计中,已经有一个Car
类,现在有一些可转换的汽车对象。
我们可以定义另一个类Convertible
和子类Car
,但是我们稍后会创建一个类FourWheelDrive
的类,它也是Car
的子类,稍后,如果我们的FourWheelDrive
也是Convertible
,那么我们该如何处理呢?
上面的设计与其他设计相比如何,isConvertible
类中的Car
布尔值,isFourWheelDrive
类中的Car
布尔值,就像Car
类的标志或属性一样。因此,在这种情况下,我们不会定义额外的类。
更新:在现实生活中的例子,在我们的项目中,有一个Credential
类存储用户的信息:user_id,encrypted_password,email_address等。当我们允许登录时通过Facebook,Gmail,雅虎,MySpace(使用JanRain),同事建议添加FacebookCredential
,GmailCredential
,YahooCredential
,所有这些类都是Credential
的子类。我有点不知所措,因为有很多类,当你看到一个方法时,你必须看看子类是否重写它或者它是基类的方法。我本来只是使用代码来告诉它是哪个提供商(Facebook,Gmail等),并使用此提供程序代码来执行相应的操作。 (例如,某些提供商已经验证了电子邮件地址,有些则没有)。所以我只是不知道我的同事的方法是否更合适或更复杂。
答案 0 :(得分:2)
您可能希望使用http://en.wikipedia.org/wiki/Strategy_pattern采用不同的方法 您可以为不同类型的汽车定义不同的行为,因此您没有很多子类。
答案 1 :(得分:1)
您暗示您使用的语言不支持多重继承。语言是否支持接口?你可以有一个基础抽象类Car
。 (摘要因为从来没有构建“汽车”,而是构建汽车的特定实现。)然后继承抽象基类的类的实例可以实现公共接口:
IConvertible
IFourWheelDrive
IHybrid
这个想法是抽象基类最简单地定义 的内容。接口定义了它的类型,并且肯定会有重叠。这些接口将包含特定于该类型的操作和属性。 (IConvertible
将具有不可转换的不具有的属性和方法,与IHybrid
相同,等等。)然后,具体实现可以为整个事物添加自己独特的天赋。
如你所知,这是一个人为的例子。所以这都是猜想。但对于这个特定的理论实现,我会选择接口。
答案 2 :(得分:1)
除了您对可转换的四轮驱动汽车的关注外,请考虑以下因素:
对我来说,这些问题都指出了汽车的属性并没有定义类型。从某种意义上说,它们与颜色或门的数量等没有区别。
答案 3 :(得分:0)
这基本上归结为一个问题,你是否需要/想要根据它是可转换的还是四轮驱动来改变类的功能。例如,如果您需要/希望为敞篷车提供raise_top
和lower_top
,为四轮驱动提供lock_hubs
和unlock_hubs
,那么您非常需要使用继承来添加具有这些的类。在这种情况下,那么是的,敞篷四轮驱动车辆将继承敞篷车和四轮驱动车级的机会非常公平。因此,如果你在C ++中这样做,那些类应该可能从automobile
(或者你的基类命名)实际上继承,而在类似Java的东西中,它们几乎需要是接口而不是比上课。
另一方面,如果您只需要能够找出特定车辆是否可转换和/或4轮驱动,那么该类中的简单布尔(或枚举)字段应该是完全足够。