クラス変数は、そのクラスに存在するので、継承したときに継承したクラスの変数ができるわけではなく、
継承先の子から親の変数を指し示すことができるだけ。

class BaseClass
  @@s = "baseclass"
  def BaseClass.s
    @@s
  end
  def BaseClass.s=(val)
    @@s = val
  end
end

class ExtendClass < BaseClass
end

class ExtendClass2 < BaseClass end

p BaseClass.s     #=> "baseclass"
p ExtendClass.s   #=> "baseclass"
p ExtendClass2.s  #=> "baseclass"

ExtendClass.s = "ab"
p BaseClass.s     #=> "ab" 親も変わる
p ExtendClass.s   #=> "ab"
p ExtendClass2.s  #=> "ab" 別の継承元クラスも、親を指しているだけなので変わる

javaでも話は同じ

public class BaseClass {
	private static String s = "baseclass";

	public static void setS(String s) {
		BaseClass.s = s;
	}

	public static String getS() {
		return s;
	}
}

public class ExtendClass extends BaseClass {

}

public class ExtendClass2 extends BaseClass {

}

public class BaseClassTest extends TestCase {

	public void testGetObjectClass() {
		System.out.println(BaseClass.getS());     //#=> "baseclass"
		System.out.println(ExtendClass.getS());   //#=> "baseclass"
		System.out.println(ExtendClass2.getS());  //#=> "baseclass"
		ExtendClass.setS("ab");
		System.out.println(BaseClass.getS());     //#=> "ab"
		System.out.println(ExtendClass.getS());   //#=> "ab"
		System.out.println(ExtendClass2.getS());  //#=> "ab"

		assertEquals(BaseClass.getS(),   "ab");
		assertEquals(ExtendClass.getS(), "ab");
		assertEquals(ExtendClass2.getS(),"ab");
	}

}

そうすると、子のクラスで共通的に持っておくべき値を親クラスで定義したい時ってどうするんだろ?
とりあえず、親クラスにHash(KEYは子クラス名)で持っておくことで解決したけど、そもそもクラス変数を
使うってのが間違ってるのかなとも思うけど、設定情報とかだとインスタンス変数で重ね持ちするのも嫌だし、
外部の設定情報を持たせるものを作るのもシンプルじゃないし、うーん。

Pocket

Comments are closed.