我有一个像
ABC(文件夹) ----> abc.rb, def.rb
DEF(文件夹) ----> a1.rb, b1.rb
GHI(文件夹) ----> x1.rb, y1.rb
我想继承/包含 def.rb,这是 abc.rb 中的一个模块,然后 a1 应该继承 abc.rb 并且应该能够访问 def.rb 中定义的所有方法。
现在,我在每个脚本文件中都包含了 def.rb,但我不想这样做。我只想垂直继承。
我有一个像
ABC(文件夹) ----> abc.rb, def.rb
DEF(文件夹) ----> a1.rb, b1.rb
GHI(文件夹) ----> x1.rb, y1.rb
我想继承/包含 def.rb,这是 abc.rb 中的一个模块,然后 a1 应该继承 abc.rb 并且应该能够访问 def.rb 中定义的所有方法。
现在,我在每个脚本文件中都包含了 def.rb,但我不想这样做。我只想垂直继承。
很难处理类似 ABC 的命名系统)
如果你想在每个类中包含 10 个模块,你可以这样做。假设您有模块ModuleTest::Files
和ModuleTest::Network
:
在 module_test/network.rb
module ModuleTest
module Network
def network
puts 'hello from ModuleTest::Network#network'
end
end
end
在 module_test/files.rb
module ModuleTest
module Files
def files
puts 'hello from ModuleTest::Files#files'
end
end
end
你可以像这样制作一些ModuleTest::Base
课程:
require 'module_test/files'
require 'module_test/network'
module ModuleTest
class Base
include Files
include Network
end
end
这个类包括你拥有的所有功能,所以从它继承你的类:
require 'module_test/base'
class Foo < ModuleTest::Base
end
foo = Foo.new
foo.network
foo.files
输出:
>ruby -I. foo.rb
hello from ModuleTest::Network#network
hello from ModuleTest::Files#files
首先要指出的是,我怀疑我误解了您的问题,因为我不明白您为什么要这样做。所以如果是这种情况,请指出,我会删除它。
您描述的过程有效(至少在 Ruby 1.9.3 中对我而言)。
module Def
def method_from_def
puts "Method from Def"
end
end
class Abc
include Abc
end
class X < Abc
end
X.new.method_from_def #=> "Method from Def"
您可能需要在您的 require 语句中稍微具体一点,但是如果您已经能够“包含”该脚本,那么您已经把它记下来了。(除非“包含”是指将其复制并粘贴到源文件中。)