如何重写类方法以便在父类中访问它



我有一个类方法,用来获取类的替代名称。这个想法是有一个抽象的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)

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

如果将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

Oops。。。我刚刚发现,您必须使用self.class.name来访问实例内部的类方法。像这样:

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

它现在起作用了。

最新更新