From: Nonta <nonta / yo.rim.or.jp>
Subject: [ruby-list:41043] 親クラスのインスタンスを元に子クラスのインスタンスを作りたい
Date: Fri, 19 Aug 2005 23:33:47 +0900

るびきちです。

> a = A.new
> a.set(1)
> b = B.new(a)
> b.get()  =>  1が返ってきて欲しい

まつもとさんのメールにあるように委譲を使うといいと思います。
forwardable.rbを使った別解を。

require 'forwardable'
class A
  def initialize(a = nil)
    @x = a && a.x
  end

  # Rubyの場合、attrなどでアクセサを定義できます。
  # attr_accessorは読み書き可能に。
  attr_accessor :x 
end

class B
  # なぜextendなのかというと、
  # Forwardableモジュールが動的にメソッドを定義しているため。
  extend Forwardable
  # ここで委譲したいメソッドを設定。複数指定することも可能。
  def_delegators(:@a, :x)
  def initialize(a)
    @a = a
  end
end

a = A.new
a.x = 1
b = B.new(a)
b.x #   =>  1

> もちろん、上記の例では(*)の代わりに(**)を使えば実現する
> かと思うのですが、インスタンス変数が多いとちょっと面倒に
> なってしまいます。
Rubyの場合はattr/attr_reader/attr_writer/attr_accessorを使うとokです。

> 実際に仕事ではVB.NETで書いていたのですが、本質的にはRubyでも
> 同じだと思いまして、こちらに投稿いたしました。
VBは使ったことはないのですが、元のソースのように
いちいちgetter/setterをメソッドでゴリゴリ書かないといけないのでしょうか?
そうだとすると、コードジェネレーターを記述することを考えたほうが
いいかもしれません。


るびきち☆
http://www.rubyist.net/~rubikitch/