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