我想知道如何正确初始化子类"计算机。"我希望它继承Game类中初始化的属性,除了#start,这是一个方法。在这种情况下,我也不确定如何处理initialize方法中的参数。有谁知道一种优雅的方式来改写它?感谢。
class Game
attr_reader :input, :clues
def initialize
colors = %w(R O Y G I V)
code = []
all = ''
count = 0
start
end
def start
...
end
def ask_input
...
end
class Computer < Game
attr_reader :input, :clues
def initialize
colors = %w(R O Y G I V)
code = []
all = ''
count = 0
ask_input
computer_turn
end
.....
end
答案 0 :(得分:1)
我希望它继承Game类中的初始化属性,除了#start,这是一个方法。
将继承所有属性和方法。你这样做是正确的:
class Computer < Game
您不需要attr_reader
,因为它是从Game继承的。
在这种情况下,我也不确定如何处理initialize方法中的参数。
您可以执行以下操作。它以输入为参数。考虑:
computer = Computer.new( :foo )
计算机初始化后,input
等于:foo
。
class Computer < Game
def initialize input
@input = input
...
请参阅:
computer.input
=> :foo
答案 1 :(得分:1)
我也不确定在这种情况下如何处理initialize方法中的参数
你只是
super
中添加initializer
以调用其超类的initializer
。 @
个字符,以使它们可用于所有实例menthod。attr_reader
类中移除Computer
,因为它将从Game
类继承我希望它继承Game类中初始化的属性,除了#start,这是一个方法
#start
类的方法Game
,我认为您只需要在Computer
类结果代码
class Game
attr_reader :input, :clues
def initialize
@colors = %w(R O Y G I V)
@code = []
@all = ''
@count = 0
start
end
def ask_input
# sample value for @input
@input = 'sample input'
end
def start
puts "start"
end
end
class Computer < Game
#attr_reader :input, :clues
def initialize
super
ask_input
computer_turn
end
def start
# Do nothing
end
def computer_turn
puts "computer_turn"
p @colors
end
end
comp = Computer.new
# The string "start" is not puts here because Game#start is not called
=> computer_turn
=> ["R", "O", "Y", "G", "I", "V"]
comp.input
=> "sample input"
答案 2 :(得分:0)
由于您不想要方法start
,只需将其从Game
类中删除,以便它不会出现在您的子类中。类似的东西:
class Game
attr_reader :input, :clues
def initialize
colors = %w(R O Y G I V)
code = []
all = ''
count = 0
(Insert what start does here)
end
def ask_input
...
end
然后,只需使用:
覆盖Computer
子类的初始化
def initialize
colors = %w(R O Y G I V)
code = []
all = ''
count = 0
(insert other functionalities)
end
您还可以消除冗余attr_reader
,因为它已从Game