パンくず
リファクタリング-プログラマーの体質改善テクニック
継承の取り扱い
委譲による継承の置き換え
内容
リファクタリング名
委譲による継承の置き換え
適用ケース要約
サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない
適用詳細
継承にふさわしくないような場面で継承が利用されていた場合に委譲に置き換える。
サンプル
データリストのクラスをListを継承して作成してあるケースを想定し、
委譲に置き換えます。
サンプルコード
# encoding: Shift_JIS class Order attr_accessor:order_no def initialize(order_no) @order_no=order_no end end class OrderList < Array def add_order(order) self.push(order) end def pop_order() self.pop() end end order_list = OrderList.new order_list.add_order(Order.new(1)) order_list.add_order(Order.new(2)) order_list.add_order(Order.new(3)) order_list.pop_order() order_list.each {|order|puts "order_no:#{order.order_no}"}
# encoding: Shift_JIS class Order attr_accessor:order_no def initialize(order_no) @order_no=order_no end end class OrderList attr_accessor:order_list def initialize() @order_list=Array.new end def add_order(order) @order_list.push(order) end def pop_order() return @order_list.pop() end def get_list() return @order_list end end order_list = OrderList.new order_list.add_order(Order.new(1)) order_list.add_order(Order.new(2)) order_list.add_order(Order.new(3)) order_list.pop_order() order_list.get_list().each {|order|puts "order_no:#{order.order_no}"}
出力(共通)
order_no:1 order_no:2