2011-09-08 3 views
1

J'ai donc beaucoup de classes enfants qui hériteront d'une classe parente. J'ai joué avec les variables d'instance @ et les variables de classe @@ et je dois encore être en mesure de réaliser avec eux ce que je veux. Ce que je veux réellement fonctionne avec le code ci-dessous mais il ne semble pas DRY du tout. Des suggestions sur la façon dont je peux refactoriser cela?Hiérarchie des classes parent et enfant

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 

Ce que je souhaite réaliser

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

>> Earth.position 
3 

Répondre

0

est ce utile pour vous? J'ai essayé, cela fonctionne dans 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

Il semble y avoir aucune raison pour que vos planètes spécifiques (comme Earth) à être les types à tous: Earth n'est pas une famille de planètes liées, il est simplement une seule planète. Vous pouvez être mieux servis par un ensemble de constantes:

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 

Si vous créez des constantes globales vous dérange, par tous les moyens de les envelopper dans un module (? Peut-être Planets)

+0

Je suis plus à la recherche d'une solution qui n'implique pas de constantes et d'inclure d'autres modules. Merci! – axsuul

+0

Une raison? Il semble que la question n'a pas assez de contexte pour décrire votre scénario. – phs

Questions connexes