0

我有一个Book < LibraryItem

和 a Book::Page,定义为

class Book
  class Page

在模型/书/page.rb

LibraryItem有一个方法叫做can_edit?

但是我Book::Page.new.can_edit?没有返回任何方法错误...

如何LibraryItem在我的命名空间中包含实例方法?

4

3 回答 3

1

如果您在 irb 控制台上运行此代码,Ruby 默认访问父方法:

class LibraryItem
  def can_edit?
    true
  end
end

class Book < LibraryItem
  class Page
  end
end

您可以轻松访问 can_edit?方法,只是做:

book = Book.new
book.can_edit?

但是从 Page 类你不能访问 LibraryItem 方法,因为它不在继承链上

提示:命名空间使用模块而不是嵌套类。

于 2012-07-31T21:00:20.180 回答
1

根本问题是 ruby​​ 不支持多重继承。像这样的问题和这样的问题表明您应该考虑将功能拉出到可以任意包含在类定义中的模块中。

于 2012-07-31T20:37:08.710 回答
1

这将返回错误,因为Page没有can_edit?方法。ABook有一个Page类,但Page不是Libraryitem 的子类(只是Book)。所以can_edit?对 有效Book但对无效Page

尝试

p Book::Page.superclass

你会得到Object

于 2012-07-31T20:36:30.130 回答