犬と猫の呪縛から逃れろ!

OOPオブジェクト指向プログラミングの説明で、犬や猫を使った例というものがよくある。
以下のようなものだが、これを見ても実際コードを組む上で何が嬉しいのか見えてこない。

class Animal {
	function __init__(name) { _name = name }
	function say() { }
}
class Dog extends Animal {
	function say() { print _name + ":bow" }
}
class Cat extends Animal {
	function say() { print _name + ":meow" }
}

function main() {
	animal = new Dog("siro");
	doSay(animal); // bowと3回鳴く

	animal = new Cat("siro");
	doSay(animal); // meowと3回鳴く
}
function doSay(animal) {
	animal.say();
	animal.say();
	animal.say();
}

だがこれをCsv出力クラス、Tsv出力クラスに変えてやると現実的なプログラムでOOPがどのように役立つのかが、少しは掴めるのではないだろうか。

class DataPrinter {
	function __init__(datas) { _datas = datas; currentLine=0; }
	function printLine() { }
}
class CsvDataPrinter extends DataPrinter {
	function printLine() { print _datas[currentLine++].join(",") }
}
class TsvDataPrinter extends DataPrinter {
	function printLine() { print _datas[currentLine++].join("\t") }
}

function main() {
	datas = [["data1-1", "data1-2", "data1-3"],
		     ["data2-1", "data2-2", "data2-3"],
		     ["data3-1", "data3-2", "data3-3"]];

	printer = new CsvDataPrinter(datas);
	doPrint(printer);	// カンマ区切りでデータが3行出力される

	printer = new TsvDataPrinter(datas);
	doPrint(printer);	// タブ区切りでデータが3行出力される
}
function doPrint(printer) {
	printer.printLine();
	printer.printLine();
	printer.printLine();
}