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

如何在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 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