Ruby自定义超级初始化
以下是我的情况:Ruby自定义超级初始化,ruby,xmlrpcclient,Ruby,Xmlrpcclient,以下是我的情况: XMLRPC::Client有一个代理构造函数,new3,它接受散列选项。它取出各个值,然后将构造委托给默认的初始值设定项,initialize 我来自XMLRPC::Client。我想要一个类,它是XMLRPC::Client,但具有一些附加功能 我希望能够使用散列选项来实例化这个派生的类。这意味着在派生类的初始化器中,我必须以某种方式使用new3代理构造函数实例化super 如果可能的话,我的问题是。如果没有,那么解决这个问题的唯一方法就是将XMLRPC::Client
有一个代理构造函数,XMLRPC::Client
,它接受散列选项。它取出各个值,然后将构造委托给默认的初始值设定项,new3
initialize
- 我来自
。我想要一个类,它是XMLRPC::Client
,但具有一些附加功能XMLRPC::Client
- 我希望能够使用散列选项来实例化这个派生的类。这意味着在派生类的初始化器中,我必须以某种方式使用
代理构造函数实例化new3
super
XMLRPC::Client.new3
方法中的代码实际“复制并粘贴”到我的派生类构造函数中
我问这个问题的原因仅仅是想看看是否有办法解决这个问题,因为Ruby社区中有一个反复出现的主题DRY(不要重复你自己)。但是当然,如果这是唯一的方法,它不会杀了我。您应该能够调用子类上的
new3
class MyClient < XMLRPC::Client
end
MyClient.new3({})
classmyclient
或者,如果您需要执行其他操作,请覆盖它:
class MyClient < XMLRPC::Client
def self.new3(args)
client = super(args)
# do some more stuff
client
end
end
MyClient.new3({})
classmyclient
在派生类中创建一个新的类方法(就像他们最初创建new3
时所做的那样):
classmyderived123,…)
super
仅在initialize
中起作用(并且仅将参数更改为超类的initialize
),因此它在这里不适用。我只是发布了一个答案,通过向您展示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
嗯。。对不起什么?客户端已经具有该类方法。这个问题的重点是看是否有办法/避免/新3已经完成的工作。因此,将
new3
替换为yourNew
,将new
替换为new3
。没有?从这些答案来看,我认为我的问题太误导人了,我会重新陈述。我不是说我希望在派生类中有一个新的3方法。另外,我是从XMLRPC::Client派生出来的,所以将其设为Client=(客户机=)没有多大意义,或者我弄错了吗?您基本上需要创建一个工厂方法,该方法返回您想要的对象的实例,按照您想要的方式构造。在ruby中不能像在java中那样重载构造函数,所以必须这样做。@Jorge:如果它是类方法(注意它是self.new3
)。在本例中,您是否只想使用XMLRPC::Client.new3
?只是重载了self.new,在这种情况下。是的,Jeremy,我在问题中提到了这个。。。我知道new3是如何定义的。我的问题是,我是否必须将new3中的代码复制并粘贴到派生类的构造函数中。重复代码没有多大意义,特别是因为它在我派生的类中。我的问题是,如果这是唯一的方法,如果是的话,那很好,我会这么做。我或其他人说你必须复制和粘贴代码是在哪里?您只需在类方法中调用new3
,然后返回该实例。就像hownew3
调用new
一样。我不会指责任何人说。。。我在问是不是这样。问题是我确实调用了new3,但它一直说它是一个未定义的方法。好的,谢谢,所以我认为没有一种方法可以实现我想要的。没问题,我将在派生类的initializer中重新使用new3中的代码。好的,这让我想问:Arlen的答案有什么问题?你还需要访问超级类的new3
?哇,呃,你能整理一下这个问题,让它反映出你想问的问题吗?你现在问了几个问题:“我的问题是”,“我会重申我的问题”,“我的问题是”。如果是这样的话,就把它掏出来也没关系,只要把它放在同一个主题上,通常放在同一个问题上。@Greg:我确实清理了这个问题,只是我在问题的前一部分做了一个“删除线”,而不是在人们读到它的时候直接删除它。我现在删除它:)我真的希望你不要试图阅读问题的删掉部分,哈哈,删掉它是有原因的。
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