1

这是我的情况:

  • XMLRPC::Client有一个代理构造函数,new3它接受一个选项的哈希值。它取出各个值,然后将构造委托给默认初始化程序,initialize
  • 我来自XMLRPC::Client. 我想要一个具有 XMLRPC::Client一些附加功能的类。
  • 我也希望能够使用选项哈希来实例化这个派生类。这意味着在我的派生类的初始化程序中,我必须以某种方式super使用new3代理构造函数进行实例化。

我的问题是这是否可能。如果不是,那么解决这个问题的唯一方法是实际上将XMLRPC::Client.new3方法中的代码“复制并粘贴”到我的派生类的构造函数中吗?

我问这个的原因只是想看看是否有解决这个问题的方法,因为在 Ruby 社区中有一个反复出现的 DRY(不要重复你自己)的主题。但当然,如果这是唯一的方法,它不会杀了我。

4

3 回答 3

1

你应该可以调用new3你的子类

class MyClient < XMLRPC::Client
end
MyClient.new3({})

如果您需要做额外的事情,或者覆盖它:

class MyClient < XMLRPC::Client
  def self.new3(args)
    client = super(args)
    # do some more stuff
    client
  end
end
MyClient.new3({})
于 2010-11-22T23:20:48.777 回答
1

在派生类中创建一个新的类方法(就像他们new3一开始所做的那样):

class MyDerived < XMLRPC::Client
    def self.new3(hashoptions)
         client = XMLRPC::Client.new3(hashoptions)
         # Do further initialisation here.
    end
end

myone = MyDerived.new3(:abc => 123, ...)

super仅适用于initialize(并且仅将参数更改为超类的initialize),因此不适用于此处。

于 2010-11-22T23:31:38.107 回答
1

我只是发布一个答案,通过向您展示 XMLRPC 的代码是如何编写的来补充其他答案

def new3(hash={})

      # convert all keys into lowercase strings
      h = {}
      hash.each { |k,v| h[k.to_s.downcase] = v }

      self.new(h['host'], h['path'], h['port'], h['proxy_host'], h['proxy_port'], h['user'], h['password'],
               h['use_ssl'], h['timeout'])
    end

http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/xmlrpc/rdoc/classes/XMLRPC/Client.html

于 2010-11-22T23:45:21.373 回答