【发布时间】:2017-05-28 22:32:32
【问题描述】:
我最近学习了如何通过模块实现继承。但是,如果我想实现多重继承,我看不到干净的解决方案。 这是使用单继承并调用超类的初始化方法的原始示例。:
module ModuleB
def initialize
puts "initialize from ModuleB"
@b = 5
end
end
module ModuleA
include ModuleB
def initialize
super
puts "initialize from ModuleA"
@a = @b
end
def action_1
@a = @b + 1
end
end
class ClassA
include ModuleA
def initialize
super
puts 'initialize - method in ClassA'
@c = @a
@d = @b
puts "a = #@a"
puts "b = #@b"
puts "c = #@c"
puts "d = #@d"
end
end
instA = ClassA.new
puts instA.action_1
但是,如果 ClassA 中包含额外的 ModuleC,我们将如何调用“超类”初始化方法?
module ModuleB
def initialize
puts "initialize from ModuleB"
@b = 5
end
end
module ModuleA
include ModuleB
def initialize
super
puts "initialize from ModuleA"
@a = @b
end
def action_1
@a = @b+1
@a = @b + 1
end
end
module ModuleC
include ModuleB
def initialize
super
puts "initialize from ModuleC"
@a = 'cute Zuzia'
end
def action_1
@a = 'something'
end
end
class ClassA
include ModuleA
include ModuleC
def initialize
super # which initialize will be called? From moduleA or from moduleC?
# what if I wanted to invoke ModuleC initialize from classA instance as well?
puts 'initialize - method in ClassA'
@c = @a
@d = @b
puts "a = #@a"
puts "b = #@b"
puts "c = #@c"
puts "d = #@d"
end
end
在这种情况下如何使用mixin启用多重继承?
【问题讨论】:
-
我知道这段代码“只是为了好玩”,但我认为您曾经不想在
module中定义initialize方法- 那只是自找麻烦。同样,我会害怕任何在模块之间混合方法的代码......所以虽然你是正确的,语言的行为有些不清楚(就像任何复杂的继承示例一样,在任何语言中!),这是一个非常您正在试验的不切实际的代码示例。
标签: ruby inheritance mixins