1

これが私の状況です:

  • XMLRPC::Clientnew3には、オプションのハッシュを取るプロキシ コンストラクタがあります。個々の値を取り出して、構築をデフォルトの初期化子に委譲します。initialize
  • から派生していXMLRPC::Clientます。ある XMLRPC::Clientが、いくつかの機能が追加されたクラスが必要です。
  • オプションのハッシュも使用して、この派生クラスをインスタンス化できるようにしたいと考えています。これは、派生クラスの初期化子で、プロキシ コンストラクターsuperを使用して何らかの方法でインスタンス化する必要があることを意味します。new3

私の質問は、これが可能かどうかです。XMLRPC::Client.new3そうでない場合、これを解決する唯一の方法は、メソッド内のコードを派生クラスのコンストラクターに実際に「コピーして貼り付ける」ことですか?

私がこの質問をした理由は、単にこの問題を解決する方法があるかどうかを確認するためです。なぜなら、Ruby コミュニティー内で DRY (Don't Repeat Yourself) というテーマが繰り返されているからです。もちろん、これしかないのなら、私を殺すことはありません。

4

3 に答える 3

1

派生クラスで新しいクラス メソッドを作成します (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) ため、ここでは適用されません。

于 2010-11-22T23:31:38.107 に答える
1

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({})
于 2010-11-22T23:20:48.777 に答える
1

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

于 2010-11-22T23:45:21.373 に答える