JavaでRubyのModule的なものが欲しかった件
下記のFooモジュールのcallメソッド内の”chain(arg,@tag,@dbg)”みたいに、
includeした先のクラスのフィールドをモジュール側でバインドしたかったのだけなんだが
Javaでどう書いてよいか解らなかった。
ので仕方なくクラスA, B, Cに、call抽象メソッドを宣言したinterfaceを継承させて
callメソッド定義をコピペしたw;*1
module Foo def call(arg) if @chain @chain.each do |obj| obj.call arg end end @dbg = chain(arg,@tag,@dbg) end def add_chains arg @chain = arg end private def chain arg,tag,dbg if arg == tag dbg ? false : true else dbg end end end class A include Foo def initialize @tag = :a @dbg = false @b =B.new; @c = C.new add_chains [@b,@c] end def dbg; @dbg; end def to_s [@dbg, @b.dbg, @c.dbg] end end class B include Foo def initialize @tag = :b @dbg = false @chain = nil end def dbg; @dbg; end end class C include Foo def initialize @tag = :c @dbg = false @chain = nil end def dbg; @dbg; end end a = A.new a.call :a p a.to_s #=> [true, false, false] a.call :a a.call :b p a.to_s #=> [false, true, false] a.call :a a.call :c p a.to_s #=> [true, true, true]