父类和子类层次结构

时间:2011-09-08 05:34:55

标签: ruby ruby-on-rails-3

所以我有很多将从父类继承的子类。我一直在玩实例变量@和类变量@@,我还没有能够实现我想要的。我想要的实际上与下面的代码一起工作,但它看起来根本不干。关于如何重构这个的任何建议?

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

2 个答案:

答案 0 :(得分: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?)

答案 1 :(得分: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