如何确保此方法适用于其子类?

时间:2011-07-30 16:49:29

标签: ruby

我有一对简单的类看起来像这样:

class X
  include Singleton
  def base_name; self.class.name; end
end

class Y < X
  # ...
end

我想在#basename(以及Y的任何其他子类)上调用X来返回“X”,而不是子类的名称。

最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

试试这个:

class A
  BASE_NAME = self.name
  def base_name
    BASE_NAME
  end
end

class B < A
end

A.new.base_name # => "A"
B.new.base_name # => "A"

答案 1 :(得分:0)

一些元编程:

class X
  def base_name; self.class.name; end
  def self.inherited(subclass)
    subclass.class_eval do 
        define_method(:base_name) do 
          self.class.ancestors[1].name
      end
    end
  end #inherited
end

class Y < X
end

p X.new.base_name
p Y.new.base_name

但我不会用它。 jtbandes的回答在我看来更好。