将所有方法从一个类复制到另一个类
问题描述:
我有两个类,我想将所有方法从一个类复制到另一个类。有些方法不会有参数,有些会有参数,有些会有散列作为参数。而且我从来不知道哪些人会。所以我创建了这个代码,直到我发现它没有考虑到参数。有没有办法从一个Class中获取方法列表,然后将它们完全克隆到另一个类中?将所有方法从一个类复制到另一个类
def partial(cls)
cls.instance_methods(false).each do |method_name|
define_method(method_name) do
cls.new.method(method_name.to_sym).call
end
end
end
的方法是在第一类使用define_method动态创建的,所以我不能只用一个包含。上面的代码已经传入了cls,然后它会找到所有实际写入该类的实例方法,而不是它继承的实例方法,然后创建一个具有相同名称的新方法。当这个方法被调用时,它实际上用同名的方法调用另一个类。这很有用,除非我有参数。我有条件检查,看它是否有参数,然后让它调用一个带参数的方法,但它没有很好地处理哈希。它将散列作为一个参数的数组,这不是我想要的。
我在想,如果有一个简单的方法来从字面上说,“嘿,你知道这个方法,不管它是什么,硬是让同样的事情,这个其他类。”
答
如果所有的方法都是相同的,为什么不把它们定义在一个包含在这两个类中的通用模块中呢?你提到不使用包括因为这些方法是动态定义的,但是,这并不意味着当你混入模块,他们不会被人发现:
module Foo
def self.make_an_example_method(name)
define_method(name) do |*args|
puts "I am #{name} called with (#{args.inspect})"
end
end
end
class A
include Foo
end
class B
include Foo
end
Foo.make_an_example_method(:example)
Foo.make_an_example_method(:dynamic)
A.new.example # => I am example called with ([])
B.new.dynamic(1,2,3) # => I am dynamic called with ([1, 2, 3])
答
你可以尝试SimpleDelegator:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/delegate/rdoc/SimpleDelegator.html
答
你也可以尝试DelegateClass:
class NamedArray < DelegateClass(Array)
def initialize n
@name = n
super(Array.new)
end
def sayName
"My name is #{@name}"
end
end
我很困惑你想做什么。你正在讨论实例方法,但是你会说'用同名的方法调用另一个类。除非你跟踪其他班级的情况,否则这是行不通的。 – AShelly 2012-03-19 18:45:17