-3

比方说,如果在我们的对象设计中,已经有一个Car类,现在有一些汽车对象就是敞篷车。

我们可以定义另一个 classConvertible和 subclass Car,但是假设我们稍后创建一个 class that is FourWheelDrivethat 也是 subclasses Car,然后,如果我们有 a FourWheelDrivethat is also a Convertible,那么我们该如何处理呢?

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

更新:在一个真实的例子中,在我们的项目中,有一个Credential类存储用户的信息:user_id、encrypted_pa​​ssword、email_address 等。当我们允许通过 Facebook、Gmail、Yahoo、MySpace(使用 JanRain)登录时,同事建议添加FacebookCredential, GmailCredential, YahooCredential, 所有这些子类Credential. 我有点不知所措,有这么多类,当你看到一个方法时,你必须看看是子类覆盖了它还是基类的方法。我会使用一个代码来告诉它是哪个凭据提供者(Facebook、Gmail 等),并使用这个提供者代码来做适当的事情。(例如,有些提供商已经验证了电子邮件地址,有些则没有)。所以我只是不知道我同事的方法是否更合适或更复杂。

4

4 回答 4

2

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

于 2012-04-22T23:24:39.127 回答
1

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

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

这个想法是抽象基类定义了简单的东西。接口定义了它是什么类型,当然可以有重叠。这些接口将包含特定于该类型的操作和属性。( AnIConvertible将具有不可转换的属性和方法,与 anIHybrid等相同。)然后特定的实现可以为整个事物添加自己独特的风格。

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

于 2012-04-22T23:25:25.130 回答
1

除了您对也是敞篷车的四轮驱动汽车的担忧之外,请考虑以下事项:

  • 都是敞篷车吗?
  • 所有的车辆都是四轮驱动车吗?

对我来说,这类问题指向的是汽车的这些属性,它们没有定义类型。从某种意义上说,它们与颜色或门的数量等没有什么不同。

于 2012-04-22T23:30:30.740 回答
0

它基本上归结为一个问题,您是否需要/想要根据它是敞篷车还是四轮驱动来更改该类的功能。例如,如果您需要/想要拥有一辆敞篷车raise_top和一辆四轮驱动车,那么您几乎需要使用继承来添加具有这些的类。在这种情况下,是的,敞篷四驱车很有可能同时继承敞篷车和四轮驱动车型。因此,如果您在 C++ 中这样做,这些类可能应该虚拟继承自(或任何您命名的基类),并且在 Java 之类的东西中,它们几乎需要是接口而不是类。lower_toplock_hubsunlock_hubsautomobile

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

于 2012-04-22T23:44:53.263 回答