【问题标题】:When there is a class Car, should a car that is convertible subclass Car or not? [closed]当有 Car 类时,是否应该是可转换的子类 Car? [关闭]
【发布时间】:2012-05-03 14:54:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我从不理解这些“代表现实世界构造的对象”的讨论。答案始终取决于您尝试使用代码解决的实际问题。
  • 也许至少我们知道选项是什么,它会有所帮助
  • “您应该只根据您所面临的实际问题提出实用、可回答的问题。喋喋不休的开放式问题会降低我们网站的实用性,并将其他问题推到首页之外。”
  • @Sunny 这不是一个实际的问题吗?你以前没见过有汽车的赛车游戏吧?
  • 请不要再问反问了。我建议寻找解决方案的更好地方可能是阅读书籍或参加面向对象编程和更多编程的课程。学习如何设计课程并不是你会在 SO 上学到的东西,你的工具会影响这些设计决策。

标签: oop uml ooad


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    • IConvertible
    • IFourWheelDrive
    • IHybrid
    • 等等……

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 但是...在Animal类的例子中,如果我们有兔子,我们可能会定义一个Rabbit类和子类Animal,即使所有的兔子都是动物
      • 可能所有敞篷车实际上都是汽车(我想不出反例)。但是,并非所有四轮驱动车辆都是汽车。例如,ATV 有时是四轮驱动的,但可以说它们不被视为汽车。
      • 我不确定这些问题是否有明确的答案。虽然从Animal 创建子类Rabbit 的示例在某些情况下可能有用,但在其他情况下,有人可能会争辩说Rabbit 只是Mammalia 特定实例的名称。或者在故事书的上下文中,Rabbit 可能是LeadCharacter(例如Peter Rabit)。 Ontology 不是一个简单的主题。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-17
        • 1970-01-01
        • 2012-04-30
        • 2011-06-01
        • 2010-12-04
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 2022-06-14
        相关资源
        最近更新 更多