Ruby 红宝石遗传
如何在ruby中实现以下继承Ruby 红宝石遗传,ruby,inheritance,Ruby,Inheritance,如何在ruby中实现以下继承 class Land attr_accessor :name, :area def initialize(name, area) @name = name @area = area end end class Forest < Land attr_accessor :rain_level attr_reader :name def name=(_name) begin raise "could n
class Land
attr_accessor :name, :area
def initialize(name, area)
@name = name
@area = area
end
end
class Forest < Land
attr_accessor :rain_level
attr_reader :name
def name=(_name)
begin
raise "could not set name"
rescue Exception => e
puts e.message
end
end
def initialize(land, rain_level)
@name = land.name
@rain_level = rain_level
end
end
l = Land.new("land", 2300)
f = Forest.new(l, 400)
puts f.name # => "land"
我们期待的是把f.name#=>“新大陆”这是一个你想要建造的有趣的东西 您希望两个对象共享一个值,但只允许一个对象编辑该值,另一个对象仅允许读取该值 我认为实现这一点最简单的方法是在您的例子中实现一个新的getter-in-Forest,它返回
land.name
。通过写入l.name='meow'
将f.name
也返回moew
,因为它包含对l
的引用
希望这能有所帮助。在我看来,这实际上不是OO意义上的继承。如果您更改
森林
,使其包含对土地的引用
,则您将获得所需的行为
class Forest
attr_accessor :rain_level
def name
@land.name
end
def initialize(land, rain_level)
@land = land
@rain_level = rain_level
end
end
是的,它可以在没有继承的情况下实现。如何以继承的方式接近它?。就像父亲可以设定并获得价值,而儿子只能获得价值一样,继承就是不起作用的。如果你剃了你父亲的胡子,并不意味着你的上唇也会被剃掉。我明白,我想如果我父亲改变了他的地址,那么我的地址就会自动改变。如果我的期望不是一种继承,那么请忽略它。例如,考虑一个包含人姓名、地址、电话号码、年龄、性别和种族的类人。我们可以定义一个名为Student的人员子类,其中包含该人员的平均成绩和参加的课程,以及另一个名为Employee的人员子类,其中包含该人员的职称、雇主和工资。”
class Forest
attr_accessor :rain_level
def name
@land.name
end
def initialize(land, rain_level)
@land = land
@rain_level = rain_level
end
end