【发布时间】:2010-04-07 05:12:18
【问题描述】:
我正在创建一个视频游戏。它有字符和项目。由于我希望 Characters & Items 每个都有一个名称,我是否应该创建另一个名为 NamedObjects 的类,只有一个名称字段并让 Characters & Items 扩展它?还是说太过分了?
【问题讨论】:
标签: ruby oop abstract-class
我正在创建一个视频游戏。它有字符和项目。由于我希望 Characters & Items 每个都有一个名称,我是否应该创建另一个名为 NamedObjects 的类,只有一个名称字段并让 Characters & Items 扩展它?还是说太过分了?
【问题讨论】:
标签: ruby oop abstract-class
对于像名称属性这样简单的东西,编写模块化代码可能不值得,因为您可能需要的唯一行是:
attr_accessor :name
当然,如果您预见到命名事物将来会共享更多功能,那么您的担忧是有道理的。与其使用继承,不如在 Ruby 中使用模块:
module Nameable
attr_accessor :name
# To be expanded.
end
class Item
include Nameable
end
class Character
include Nameable
end
【讨论】:
A、B 和 C 类时,使用 mixins 还可以防止很常见的情况:假设 A 和 B 共享公共功能 F' 和 A 和 C 功能F''。有了类继承,你几乎就被困在那里了。
如果他们共享的只是一个名字,那可能是矫枉过正。
【讨论】:
当类具有相同的行为而不是相同的数据时,它们通常应该共享基类。 OOP 应该始终与行为有关。在创建基类时,您还应该考虑/研究Liskov substitution principle。
【讨论】:
name)如何适应该行为/数据规则?顺便说一句,你能澄清一下 Liskov 原则与这里的问题的关系吗?我没有看到任何问题?
如你所说,在 java 中我会创建 NamedObject 接口。然而 Ruby 是一种动态的闪避类型语言。没有接口。所以只需定义一个 name 属性并在需要的地方使用它。
【讨论】:
您是否需要遍历一堆 NamedObject 并显示名称?如果是这样,您需要 NamedObjects 类。如果你不这样做,你就不会......
无论如何,你不能在这样一个小问题上犯下灾难性的错误:如果你没有为名称创建一个基类并且你以后需要它,那么你只需在以后重组你的类,没什么大不了的。如果您添加了基类并且实际上并不需要它,这不是什么大问题,可以放心地忽略它。
【讨论】: