我有Book < LibraryItem
和Book::Page
,定义为
class Book
class Page
in models / book / page.rb
LibraryItem
有一个名为can_edit?
但是我的Book::Page.new.can_edit?
没有返回方法错误...
如何在我的命名空间中包含LibraryItem
的实例方法?
答案 0 :(得分:1)
这会返回错误,因为Page
没有can_edit?
方法。 Book
具有Page
类,但Page
不是Library
项的子类(仅Book
是)。因此can_edit?
对Book
有效,但对Page
无效。
尝试
p Book::Page.superclass
您将获得Object
答案 1 :(得分:1)
根本问题是ruby不支持多重继承。问题like this one和this one指出您应该考虑将功能扩展到可以在类定义中任意包含的模块。
答案 2 :(得分: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方法,因为它不在继承链
上提示:对于命名空间,使用模块而不是嵌套类。