这可能吗?
具体地
module A
def foo
puts "a"
end
end
module B
def foo
puts "b"
end
end
module C
def foo
if self.name=='Frank'
#send to A.foo
elsif self.name=='Bob'
#send to B.foo
end
end
end
class Person
include C
attr_accessor :name
def initialize(name)
self.name=name
end
end
f=Person.new('frank').foo # => "a"
f.name="Bob"
f.foo # => "b"
此外,假设模块A和B是第三方,无法修改。
换句话说,我希望将A和B都包含在Person类中,但是根据类实例的状态动态选择使用哪个方法。
答案 0 :(得分:0)
这是一种方法:
<强>代码强>
module A
def foo
puts "a"
end
end
module B
def foo
puts "b"
end
end
module C
include A
alias :fooA :foo
include B
alias :fooB :foo
def foo
if self.name =='Frank'
fooA
elsif self.name == 'Bob'
fooB
end
end
end
class Person
include C
attr_accessor :name
def initialize(name)
self.name=name
end
end
示例强>
f=Person.new('Frank')
f.foo # => "a"
f.name="Bob"
f.foo # => "b"
<强>解释强>
module A
module C
:foo
(来自module A
)被分配了一个别名:fooA
,因此module C
现在包含方法:fooA
和foo
module B
包含在module C
:foo
的方法module B
会覆盖:foo
:foo
(来自module B
)被分配了一个别名:fooB
,因此module C
现在包含:fooA
,fooB
和{ {1}}(来自foo
)module B
创建方法foo
,从def
覆盖foo
module B
包含class Person
时,它会混合三种实例方法,module C
,:fooA
和:fooB