【发布时间】:2020-08-25 11:16:01
【问题描述】:
我正在尝试用 Java (OOP) 对某些系统进行建模,但我将使用一个更简单的示例来解释我遇到的问题(我相信这与多态性和/或继承有关)。虽然我觉得解决方案可能与合成有关。
简单地说,我们有动物、物种、鸟类和鸽子。我目前的关系是:
- Pigeon 实现/扩展Animal、Bird(Pigeon 是一种动物和鸟类)
- 鸟实现/扩展物种(鸟就是物种)
但请记住,此设计应可扩展以包含更多动物和物种。
我想做以下事情:
- 对于
List<Animal>,我希望能够添加Pigeon(和其他动物),但不能添加Species或Bird。这很满意。 - 对于
List<Bird>,我只希望能够添加Pigeon(和其他鸟类)。这很满意。 - 但是,对于
List<Species>,我只希望能够添加Bird(和其他物种);但是,通过这种设计的多态性,我也可以添加Pigeon,这是不受欢迎的(我希望 Pigeon 不是 Species 在本例中)。
我从来没有完全理解这一点,但我相信这会遇到我听过很多关于继承的问题。我希望我已经足够详细地解释了这个例子,但是如果有人对如何建模这个例子有任何建议(使用抽象类、接口、组合、设计模式等),我将非常感激!
【问题讨论】:
-
如果鸽子扩展了鸟,而鸟扩展了物种,那么鸽子是一个物种。父类的父类也是其子类'子类'的父类。
-
只要鸟是种,除非鸽子不是鸟。
-
我认为如果没有组合,这将无法实现。你需要在这里解耦一些东西。您是否考虑过让 Pigeon 仅实现 Animal(而不是 Bird)并将其与诸如 Bird 之类的 Species 对象组合在一起?
-
这正是我当时刚刚想到的,我现在正在考虑使用我正在尝试建模的实际系统。我只是想知道在这种情况下我将如何完成物种列表。我会在开始时实例化并创建物种列表,然后在这种情况下为每种动物引用列表中的对象吗?
-
如果您要实例化大量 Animal,这听起来是个好主意。我认为您也可以为您正在创建的每个 Animal 提供一个“独特的” Species 实例。在任何情况下,您都可能会从创建工厂来处理组合增加的实例化复杂性中受益。
标签: java oop inheritance polymorphism