如何覆盖类方法,以便我可以在父类中访问它

时间:2014-09-14 19:10:05

标签: ruby class inheritance

我有一个类方法,我用它来获取类的替代名称。 我们的想法是有一个抽象的Figure类,它有一个通用的方法来打印它的孩子。我想让它打印出在每个孩子中被覆盖的替代名称。

这是我的代码:

class Figure
    def to_s
        s = self.name + ' '
        @edges.each do |e|
            s += e.to_s
        end
        s
    end

    def self.name
        puts 'override me'
    end
end

class Line < Figure
    def initialize(points)
        @edges = [Edge.new(points[0], points[1])]
    end

    def self.name
        'line'
    end
end

......哪个不起作用: 'to_s': undefined method 'name' for #<Line:0x00000001f12880> (NoMethodError)

如果我用实例替换类方法它完美地工作,那么......为什么会发生这种情况?有什么区别?

2 个答案:

答案 0 :(得分:0)

如果你使name属性存储在Figure类中,这将更加简单:

class Figure
    def initialize
       @name = 'DefaultFigure'
    end

    def to_s
       s = @name + ' '
       @edges.each do |e|
          s += e.to_s
       end
       s
    end
end

class Line < Figure
    def initialize(points)
       @name  = 'Line'
       @edges = [Edge.new(points[0], points[1])]
    end
end

答案 1 :(得分:0)

哎呀...我只是想通了你必须使用self.class.name来访问INSIDE一个实例的类方法。像这样:

def to_s
    s = self.class.name + ' '
    @edges.each do |e|
        s += e.to_s
    end
    s
end

现在有效。