まとめ:図形の階層構造
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 32/61。
チャレンジ
簡単コンポジション(合成)による継承の力を示す、完全な図形階層を構築しましょう。まず、あらゆる具体的な図形が継承できるベースとなる Shape 型を作成し、次にそれを拡張した Rect を作成します。
コードは以下の3つのファイルに分けて構成します:
shape.h: インクルードガードを使用して構造体の階層を定義します。単一のcolorフィールド(整数型)を持つShape構造体を作成します。次に、最初のメンバとしてShapeを埋め込み、widthとheightフィールド(共に整数型)を追加したRect構造体を定義します。2つの関数を宣言します:Shape*と新しい色の値を受け取るset_color、およびRect*を受け取るprint_rectです。shape.c: 両方の関数を実装します。set_color関数はベース型を扱い、あらゆる図形のの色を変更します。print_rect関数は、継承された色を含む長方形のすべての情報を表示します。main.c:Rectを作成し、すべてのフィールドを初期化します。次に、長方形をShape*にキャストしてset_colorを呼び出すことで、アップキャストを実演します。最後に、長方形をプリントして、ベース型のポインタを介して色が変更されたことを確認します。
入力として、長方形の width(幅)、height(高さ)、initial color(初期の色)、および汎用関数を通じて設定する new color(新しい色)の4つを受け取ります。
メインファイルでは、初期値を使用して長方形を作成し、set_color を使用してその色を新しい値に変更します(Rect* を Shape* にキャストすることを忘れないでください)。最後に print_rect を呼び出して結果を表示します。
出力は以下のようになるはずです:
Width: 10
Height: 5
Color: 7ここで、10 は幅、5 は高さ、7 は更新された色(初期の色ではありません)です。ここでの重要な洞察は、set_color は長方形について何も知らないということです。それは Shape のみを扱います。しかし、最初のメンバのルールとアップキャストを通じて、長方形の色はこの汎用関数によって変更されます。
自分で試してみよう
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: Rect を作成し、すべてのフィールドを初期化する
// (width、height、および埋め込まれた Shape の color を initial_color で初期化)
// TODO: 長方形を Shape* にキャストして set_color を呼び出す
// 色を new_color に変更するため
// TODO: print_rect を呼び出して結果を表示する
return 0;
}