代码之家  ›  专栏  ›  技术社区  ›  Jorge Israel Peña

Ruby自定义超级初始化

  •  1
  • Jorge Israel Peña  · 技术社区  · 14 年前

    以下是我的情况:

    • XMLRPC::Client 有一个代理构造函数, new3 ,这需要大量的选项。它取出各个值,然后将构造委托给默认的初始值设定项, initialize
    • 我是从 XMLRPC::客户端 . 我想要一个班 XMLRPC::客户端 但是增加了一些功能。
    • 我想能够实例化这个 派生的 使用选项的哈希值初始化。这意味着在派生类的初始值设定项中,我必须以某种方式实例化 super 使用 新3 代理构造函数。

    我的问题是 如果可能的话。如果不是,那么解决这个问题的唯一方法就是在 XMLRPC::Client.new3 方法进入派生类的构造函数?

    这个 原因 我问这个只是想看看是否有办法解决这个问题,因为Ruby社区中有一个DRY(不要重复你自己)的重复主题。但当然,如果这是唯一的方法,它不会杀了我。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jeremy    14 年前

    我只是通过向您展示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

        2
  •  1
  •   Charlotte    14 年前

    在派生类中创建一个新的类方法(非常像 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 (并且只将参数更改为超类的 初始化 ),所以这里不适用。

        3
  •  1
  •   Petrik de Heus    14 年前

    你应该可以打电话 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({})
    
    推荐文章