2012-11-20 44 views
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" 

改变什么预期是看跌f.name#=> “新土地”

回答

0

这是一种有趣的事情,你想建立。

总结你想要两个对象共享一个值,但只有一个被允许编辑该值,另一个只允许读取它。

我觉得实现这个最简单的方法是在你的情况下在Forest中实现一个新的getter,它返回land.name。通过书写l.name = 'meow'f.name也会返回moew,因为它保留对l的引用。

希望这会有所帮助。

+0

是的,它节省了我的时间。谢谢 –

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 
+0

是的,它可以实现没有继承。如何以继承的方式来处理它?像父亲可以设置和获得价值和儿子只获得价值 –

+0

继承只是不这样工作。如果你剃去你父亲的小胡子,那并不意味着你的上嘴唇也会被剃光。 –

+0

我明白了,我希望如果我的父亲改变他的地址,那么我的地址应该会自动改变。如果我的期望不是一种继承,那么请忽略它。 –