Ruby Custom Super Initialization - PullRequest
1 голос
/ 23 ноября 2010

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

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

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

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

Ответы [ 3 ]

1 голос
/ 23 ноября 2010

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

1 голос
/ 23 ноября 2010

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

1 голос
/ 23 ноября 2010

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