1

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

假设当我更改土地 l 的名称时,它也应该更改为子类

l.name ="new land"
puts f.name # => "land"

预期的是 puts f.name # => "new land"

4

2 回答 2

2

在我看来,这实际上不是 OO 意义上的继承。如果您进行更改Forest以使其包含对的引用,Land那么您将获得您想要的行为。

class Forest
  attr_accessor :rain_level

  def name
    @land.name
  end

  def initialize(land, rain_level)
    @land = land
    @rain_level = rain_level
  end
end
于 2012-11-20T09:50:21.003 回答
0

这是您想要构建的一种有趣的东西。

总结一下,您希望两个对象共享一个值,但只允许一个对象编辑该值,另一个对象只允许读取它。

我认为实现这一点的最简单方法是在您的情况下在 Forest 中实现一个新的 getter 返回land.name。通过写入l.name = 'meow'也将f.name返回moew,因为它包含对 的引用l

希望这可以帮助。

于 2012-11-20T09:37:13.047 回答