【问题标题】:How do you delegate class methods?你如何委托类方法?
【发布时间】:2012-02-13 07:05:04
【问题描述】:

我想创建一个类,将所有实例和类方法委托给另一个类。我的目标是能够为在应用程序选项中设置的类起一个看起来适合其周围代码的名称。

这是我目前所拥有的:

require 'delegate'

class Page < DelegateClass(PageAdapter)
  # Empty
end

但是,这似乎只是委托实例方法,而不是类方法。

【问题讨论】:

  • 我认为你应该继承PageAdapter
  • ShiningRay - 我认为你是对的。我自己没有想到这一点,我觉得有点愚蠢:)如果您将其添加为答案,我会选择它

标签: ruby delegation


【解决方案1】:

您可以定义自己的委托方案:

class Page < DelegateClass(PageAdapter)
  @@delegate_class=PageAdaptor
  def self.delegate_class_method(*names)
    names.each do |name| 
      define_method(name) do |*args|
        @@delegate_class.__send__(name, *args)
      end
    end
  end
  delegate_class_method @@delegate_class.singleton_methods
end

【讨论】:

    【解决方案2】:

    你不想要委托,你想要直接子类化:

    class Page < PageAdapter
      # Empty
    end
    

    证明:

    class Foo
      def self.cats?
        "YES"
      end
      def armadillos?
        "MAYBE"
      end
    end
    
    class Bar < Foo; end
    
    p Bar.new.armadillos?
    #=> "MAYBE"
    
    p Bar.cats?
    #=> "YES"
    

    【讨论】:

    • 这不是问题:)
    • @metakungfu 注意 cmets:ShiningRay 建议子类化,并且 OP 明确意识到这是正确的答案。我添加了这个答案,因为 ShiningRay 从未返回并将评论转换为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2010-12-06
    • 2015-02-05
    相关资源
    最近更新 更多