没有修改类的全局方法

时间:2014-06-02 09:46:58

标签: ruby

我有很多带有很多对象的类,我想对这些对象(不同的不相关类)应用一个方法

示例:

pig = animal.new
pig.name = "lulu"
human = person.new
human.firstname = "John"  #There isn't method called "name".

def seeName
 puts self.name if (self.name?)
 puts self.firstname if (self.firstname?)
end

pig.seeName
human.seeName

这只是一个例子...... 我认为这是不可能的,但我正在寻找一种方法来做到这一点,而无需修改任何现有的类。

谢谢。

3 个答案:

答案 0 :(得分:5)

您可以在module中定义方法,然后在运行时将其包含在所需的类中

pig = Animal.new
pig.name = "lulu"
human = Person.new
human.firstname = "John" 

module SeeName
  def see_name
    puts self.name if (self.name?)
    puts self.firstname if (self.firstname?)
  end
end

Person.class_eval { include SeeName }
Animal.class_eval { include SeeName }

pig.see_name # => "lulu"
human.see_name # => "John"

(当然,前提是人员和动物支持namename?firstnamefirstname?

答案 1 :(得分:2)

你应该可以这样做:

def see_name(object)
  return object.name if object.respond_to? :name
  object.firstname if object.respond_to :firstname
end

see_name(pig)    #=> "lulu"
see_name(human)  #=> "John"

然而,这不是在OOP中做事的正确方法。每次遇到这样的问题,都意味着你的对象设计走错了,需要重新审视。

答案 2 :(得分:-1)

一位同事告诉我,还有另外一种方式:

class Object
  def seeName
    puts self.name if (self.name?)
    puts self.firstname if (self.firstname?)
  end
end

pig.seeName
human.seeName

到目前为止它的效果非常好。