2008年 01月 28日

Ruby. サブクラスでの定数の再定義

class Foo
	AAA   = "aaa"
	@@foo = "aaa"
	@foo  = "aaa"

	def aaa
		"aaa"
	end

	def c
		AAA
	end

	def cv
		@@foo
	end

	def iv
		self.class.instance_variable_get(:@foo)
	end

	def cg
		self.class.const_get(:AAA)
	end

	def m
		aaa
	end
end

class Bar < Foo
	AAA   = "bbb"
	@@foo = "bbb"
	@foo  = "bbb"

	def aaa
		"bbb"
	end
end

puts
p Foo.new.c  #=> "aaa"
p Bar.new.c  #=> "aaa"

puts
p Foo.new.cv #=> "bbb"
p Bar.new.cv #=> "bbb"

puts
p Foo.new.iv #=> "aaa"
p Bar.new.iv #=> "bbb"

puts
p Foo.new.cg #=> "aaa"
p Bar.new.cg #=> "bbb"

puts
p Foo.new.m  #=> "aaa"
p Bar.new.m  #=> "bbb"

なんか勘違いしてた……クラス変数はサブクラスでうわがきしてもスーパークラスに影響はないとおもってた。