【问题标题】:Ruby Abstract Class DesignRuby 抽象类设计
【发布时间】:2010-04-07 05:12:18
【问题描述】:

我正在创建一个视频游戏。它有字符和项目。由于我希望 Characters & Items 每个都有一个名称,我是否应该创建另一个名为 NamedObjects 的类,只有一个名称字段并让 Characters & Items 扩展它?还是说太过分了?

【问题讨论】:

    标签: ruby oop abstract-class


    【解决方案1】:

    对于像名称属性这样简单的东西,编写模块化代码可能不值得,因为您可能需要的唯一行是:

    attr_accessor :name
    

    当然,如果您预见到命名事物将来会共享更多功能,那么您的担忧是有道理的。与其使用继承,不如在 Ruby 中使用模块:

    module Nameable
      attr_accessor :name
    
      # To be expanded.
    end
    
    class Item
      include Nameable
    end
    
    class Character
      include Nameable
    end
    

    【讨论】:

    • 阿门。当你有 ABC 类时,使用 mixins 还可以防止很常见的情况:假设 AB 共享公共功能 F'AC 功能F''。有了类继承,你几乎就被困在那里了。
    • @Mladen Jabnović:继承 Eiffel 可以很好地处理这种情况,尽管我同意 mixin 通常是更好的解决方案。
    • +1。您可以使用模块中的几种方法来扩展此答案。 (我想不出任何自己的 ATM ......)
    【解决方案2】:

    如果他们共享的只是一个名字,那可能是矫枉过正。

    【讨论】:

      【解决方案3】:

      当类具有相同的行为而不是相同的数据时,它们通常应该共享基类。 OOP 应该始终与行为有关。在创建基类时,您还应该考虑/研究Liskov substitution principle

      【讨论】:

      • 属性访问器的概念(在这种情况下可能用于实现name)如何适应该行为/数据规则?顺便说一句,你能澄清一下 Liskov 原则与这里的问题的关系吗?我没有看到任何问题?
      【解决方案4】:

      如你所说,在 java 中我会创建 NamedObject 接口。然而 Ruby 是一种动态的闪避类型语言。没有接口。所以只需定义一个 name 属性并在需要的地方使用它。

      【讨论】:

        【解决方案5】:

        您是否需要遍历一堆 NamedObject 并显示名称?如果是这样,您需要 NamedObjects 类。如果你不这样做,你就不会......

        无论如何,你不能在这样一个小问题上犯下灾难性的错误:如果你没有为名称创建一个基类并且你以后需要它,那么你只需在以后重组你的类,没什么大不了的。如果您添加了基类并且实际上并不需要它,这不是什么大问题,可以放心地忽略它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-29
          • 1970-01-01
          相关资源
          最近更新 更多