ストラウストラップ先生のOOPは差分プログラミングなのか?
クラスはサブルーチン由来(Simula)の補足 - みねこあ について少々思う所があったので。
ストラウストラップ先生の「プログラミング言語 C++」では、オブジェクト指向プログラミングを、ADTに実装継承による差分プログラミングを組み合わせたもの(と同時に概念の階層構造を持たせたもの)のようにかかれています。
クラスはサブルーチン由来(Simula)の補足 - みねこあ
ここまで言いきられてしまうとちょっと違和感があります。
プログラミング言語C++ (アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series)
- 作者: Bjarne Stroustrup,長尾高弘
- 出版社/メーカー: アジソンウェスレイパブリッシャーズジャパン
- 発売日: 1998/12/01
- メディア: 単行本
- 購入: 9人 クリック: 272回
- この商品を含むブログ (68件) を見る
この本の 2.6 でオブジェクト指向プログラミングについて述べていますが、形状を扱うクラスの描画を行うメンバ関数が、
void Shape::draw() { switch(k) { case circle: // 円を描画 break; case triangle: // 三角形を描画 break; case square: // 正方形を描画 break; } }
というように形状毎の描画方法をもっているのは変更時のコストが大きいため、
class Shape { Point center; Color col; // ... public: Point where() { return center; } void move(Point to) { center = to; /* ... */ draw(); } virtual void draw() = 0; virtual void rotate(int angle) = 0; // ... };
というように描画や回転を行うメンバ関数を純粋仮想関数とすることで、
void rotate_all(vector<Shape*>& v, int angle) { for (int i=0; i <v.size(); ++i) v[i]->rotate(angle); }
というように図形によらない汎用関数を作ることが出来る、というように説明しています。
ですので、"インターフェースの継承とインプリメンテーションの継承を一緒に扱ってしまっている"というような説明であればそうかなとも思うのですが、id:minekoaさんのこの記事は"ストラウストラップ先生は差分プログラミングの組み合わせをオブジェクト指向プログラミングと言っている"と言うように読めるのでどうなんだろうと少し引っかかりました。