2012-11-20 5 views
1

루비에서 상속을 구현하는 방법은 무엇입니까?루비 상속

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.name ="new land" 
puts f.name # => "land" 

에 대한 변경해야, 가정은 풋 f.name # => "새 땅"

답변

0

이를 당신이 만들고 싶은 재미있는 일 이죠.

값을 공유하지만 하나만 값을 편집 할 수있는 두 개체가 필요하다고 요약하면 다른 개체는 값을 읽을 수 있습니다.

나는 이것을 구현하는 가장 쉬운 방법은 land.name을 반환하는 포레스트에 새로운 getter를 구현하는 것이라고 생각한다. 쓰기 l.name = 'meow'f.namemoewl에 대한 참조를 보유하고 있기 때문에.

희망이 도움이됩니다.

+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

아버지가 주소를 변경하면 내 주소가 자동으로 바뀌는 것처럼 보입니다. 내 기대가 일종의 상속이 아니라면 무시하십시오. –