我这周刚开始在bloc上课。我和鲁比一起练了3个月,但最后还是被卡住了。希望能得到一些帮助。
我要上的部分是关于超级
以下是简单格式的规范:
初始化时,President
类应接受name
和age
,并为这两个属性定义getter和setter。FrancePresident
和UnitedStatesPresident
应该继承自President
。President
的两个子类应定义一个citizenship
类方法,该方法根据需要返回"La France"
或"The United States of America"
。
所有的President
实例都应该有citizenship
方法,这些方法返回类的公民身份。
当要求FrancePresident
、", bien sur"
或name
时,age
的所有实例都应在其响应中附加一个citizenship
。这是个很好的例子
以下是我要满足的RSPEC规范:
describe President do
describe "initialization" do
it "takes a name and age, and delegates citizenship to the class default" do
prez = President.new("George Washington", 283)
expect( prez.name ).to eq("George Washington")
expect( prez.age ).to eq(283)
end
end
describe "children" do
it "is the parent of FrancePresident and UnitedStatesPresident" do
expect( FrancePresident.superclass ).to eq(President)
expect( UnitedStatesPresident.superclass ).to eq(President)
end
end
end
describe FrancePresident do
describe "catchphrase" do
it "sounds just right" do
expect( FrancePresident.citizenship ).to eq("La France")
sarcozy = FrancePresident.new("Nicolas Sarkozy", 59)
expect( sarcozy.citizenship ).to eq("La France, bien sur")
expect( sarcozy.age ).to eq("59, bien sur")
expect( sarcozy.name ).to eq("Nicolas Sarkozy, bien sur")
end
end
end
这是我目前的代码:
class President
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
end
class FrancePresident < President
def self.citizenship
"La France"
end
end
class UnitedStatesPresident < President
def self.citizenship
"The United States of America"
end
end
总之,我一直在努力让
citizenship
类方法工作。从这些指令看来,他们几乎希望我在citizenship
中定义一个President
类方法。但我不明白这是怎么做到的,也不符合规格,因为你不能为每个孩子单独设置公民身份。所以基本上我被困在第三和第四个目标上。如果你有时间的话,请给我回电话。
最佳答案
在您的规范中,您期望两种类型的citizenship
响应。一个有流行语,一个没有。所以你必须有两种不同的方法。一个类方法,一个实例方法。应该遵循以下原则:
class FrancePresident < President
def self.citizenship
"La France"
end
# instance method which adds the catchphrase
def citizenship
append_catchphrase(self.class.citizenship)
end
# here's your super
def age
append_catchphrase(super)
end
def catchphrase
'bien sur'
end
private
def append_catchphrase(val)
[val, catchphrase].join(', ')
end
end
关于ruby-on-rails - Ruby类( super ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30111275/