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
), поэтому здесь это не относится.