Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby自定义超级初始化_Ruby_Xmlrpcclient - Fatal编程技术网

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
,然后返回该实例。就像how
new3
调用
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