Ruby Custom Super Initialization

Вот моя ситуация:

  • XMLRPC::Client имеет прокси-конструктор, new3, что занимает хэш вариантов. Вынимает отдельные значения, чтобы затем делегировать конструкцию инициализатору по умолчанию, initialize
  • Я вытекаю из XMLRPC::Client, Я хочу класс, который XMLRPC::Client но с некоторыми дополнительными функциями.
  • Я хочу иметь возможность создать экземпляр этого производного класса, используя также хэш опций. Это означает, что в инициализаторе моего производного класса я должен каким-то образом super с использованием new3 прокси-конструктор.

Мой вопрос: возможно ли это? Если нет, то единственный способ решить эту проблему - это практически "скопировать и вставить" код в XMLRPC::Client.new3 метод в конструктор моего производного класса?

Причина, по которой я спрашиваю об этом, состоит в том, чтобы просто посмотреть, есть ли способ решить эту проблему, поскольку в сообществе Ruby существует повторяющаяся тема DRY (не повторяйте себя). Но, конечно, если это единственный путь, это не убьет меня.

3 ответа

Решение

Я только публикую ответ, дополняющий остальные ответы, показывающий, как пишется код 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

Вы, вероятно, должны быть в состоянии позвонить 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({})

Создайте новый метод класса в вашем производном классе (так же, как они сделали 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), поэтому здесь это не относится.

Другие вопросы по тегам