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"

期待されるのは put f.name # => "new land" です

4

2 に答える 2

2

これは実際にはオブジェクト指向の意味での継承ではないように思えます。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

これは、あなたが構築したい興味深いものです。

要約すると、値を共有する 2 つのオブジェクトが必要ですが、一方のみが値を編集でき、もう一方は読み取りのみが許可されます。

これを実装する最も簡単な方法は、あなたの場合、 Forest を返す新しいゲッターを実装することだと思いますland.name。への参照を保持しているため、書き込みl.name = 'meow'によってもf.name返されます。moewl

お役に立てれば。

于 2012-11-20T09:37:13.047 に答える