2011-09-08 225 views
1

所以我有很多從父類繼承的子類。我一直玩弄實例變量@和類變量@@,我還沒有能夠與他們實現我想要的。我想要的東西實際上適用於下面的代碼,但它看起來並不幹。關於如何重構這個的任何建議?父類和子類的層次結構

class Planet 
    def has_color?(color) 
     self.color == color 
    end 

    def has_position?(position) 
     self.position == position 
    end 
end 

class Mars < Planet 
    def color 
     "red" 
    end 

    def position 
     4 
    end 
end 

class Earth < Planet 
    def color 
     "blue" 
    end 

    def position 
     3 
    end 
end 

希望達成什麼

>> Mars.has_color?("red") 
true 

>> Earth.position 
3 

回答

0

這是對你有用嗎?我已經嘗試過,它在Ruby1.9.2中工作

class Planet 
     def self.has_color?(color) 
      @color == color 
     end 

     def self.has_position?(position) 
      @position == position 
     end 

     def self.position 
      @position 
     end 

     def self.color 
      @color 
     end 
    end 

    class Mars < Planet 
      @color="red" 
      @position=4 
    end 

    class Earth < Planet 
      @color="blue" 
      @position=3 
    end 

    puts Mars.has_color?("red") 
    puts Mars.has_position?("3") 
    puts Earth.position 
    puts Earth.color 
2

人們似乎沒有理由對特定行星(如Earth)是類型都:Earth不相關的行星家族,它是隻是一顆行星。您可以通過一組常數得到更好的服務:

class Planet 
    attr_reader :color, :position 

    def initialize(color, position) 
    @color, @position = color, position 
    end 

    # If you really want these.. 
    def has_color?(color) 
    @color == color 
    end 

    def has_position?(position) 
    @position == position 
    end 
end 

MARS = Planet.new("red", 4) 
EARTH = Planet.new("blue", 3) 

MARS.has_color?("red") 
EARTH.position 

如果創建全局常量困擾你,通過各種手段在一個模塊中包裹它們(?也許Planets

+0

我更尋找一種不涉及常量和其他模塊的解決方案。謝謝! – axsuul

+0

任何理由?聽起來這個問題沒有足夠的上下文來描述你的情況。 – phs