オブジェクト指向の説明(入門変)

 よくある説明でこんなのがある。

class 動物 {
	function 鳴く() {
		echo "ぎゃー!";
	}
}

class 犬 extends 動物 {
	function 鳴く() {
		echo "きゃいん!";
	}
}

class 猫 extends 動物 {
	function 鳴く() {
		echo "ふにゃー!";
	}
}

 「動物」は鳴くことができて、種類ごとに色々な鳴き方があると言う説明を以ってしてるわけだが、実際にこれは正しくないんじゃなかろうか。

 「鳴く」という行為自体は共通で「鳴き声」が違うわけだから、「鳴く」という関数をオーバーライドするのは違うように思える。

 んじゃどう実装するかというと下記。

class 動物 {

	property 鳴き声;

	function 鳴く() {
		if (this->鳴き声) {
			echo this->鳴き声;
		} else {
			echo "。。。";
		}
	}
}

class 犬 extends 動物 {
	property 鳴き声 = "きゃいん!";
}

class 猫 extends 動物 {
	property 鳴き声 = "ふにゃー!";
}

class きじ extends 動物 {
	property 鳴き声 = "(きじも鳴かずば打たれまい)";
}

class おたまじゃくし extends 動物 {
	property 鳴き声 = NULL;
}

 「鳴き声」はプロパティで、動物は「鳴く」というメソッドを持っている。各動物は自前の「鳴き声」を持っていて、動物クラスがその「鳴き声」を元に「鳴く」わけだ。おたまじゃくしみたいに「鳴き声」を持たない動物もいるかもしれないから、「鳴く」メソッドでは「鳴き声」がある場合に限り鳴いている。