【问题标题】:Java OOP - Issue with Modelling in simple example (Polymorphism). Composition or Inheritance?Java OOP - 简单示例中的建模问题(多态)。组合还是继承?
【发布时间】:2020-08-25 11:16:01
【问题描述】:

我正在尝试用 Java (OOP) 对某些系统进行建模,但我将使用一个更简单的示例来解释我遇到的问题(我相信这与多态性和/或继承有关)。虽然我觉得解决方案可能与合成有关。

简单地说,我们有动物物种鸟类鸽子。我目前的关系是:

  • Pigeon 实现/扩展AnimalBird(Pigeon 是一种动物和鸟类)
  • 实现/扩展物种(鸟就是物种)

但请记住,此设计应可扩展以包含更多动物物种

我想做以下事情:

  1. 对于List<Animal>,我希望能够添加Pigeon(和其他动物),但不能添加SpeciesBird。这很满意。
  2. 对于List<Bird>,我只希望能够添加Pigeon(和其他鸟类)。这很满意。
  3. 但是,对于List<Species>,我只希望能够添加Bird(和其他物种);但是,通过这种设计的多态性,我也可以添加Pigeon,这是不受欢迎的(我希望 Pigeon 不是 Species 在本例中)。

我从来没有完全理解这一点,但我相信这会遇到我听过很多关于继承的问题。我希望我已经足够详细地解释了这个例子,但是如果有人对如何建模这个例子有任何建议(使用抽象类、接口、组合、设计模式等),我将非常感激!

【问题讨论】:

  • 如果鸽子扩展了鸟,而鸟扩展了物种,那么鸽子一个物种。父类的父类也是其子类'子类'的父类。
  • 只要鸟是种,除非鸽子不是鸟。
  • 我认为如果没有组合,这将无法实现。你需要在这里解耦一些东西。您是否考虑过让 Pigeon 仅实现 Animal(而不是 Bird)并将其与诸如 Bird 之类的 Species 对象组合在一起?
  • 这正是我当时刚刚想到的,我现在正在考虑使用我正在尝试建模的实际系统。我只是想知道在这种情况下我将如何完成物种列表。我会在开始时实例化并创建物种列表,然后在这种情况下为每种动物引用列表中的对象吗?
  • 如果您要实例化大量 Animal,这听起来是个好主意。我认为您也可以为您正在创建的每个 Animal 提供一个“独特的” Species 实例。在任何情况下,您都可能会从创建工厂来处理组合增加的实例化复杂性中受益。

标签: java oop inheritance polymorphism


【解决方案1】:

我会像这样在红色或蓝色关系之间选择一个来改变它:

第二点不满足,但你可以使用合成来避免它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2010-09-16
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2015-03-10
    相关资源
    最近更新 更多