プログラミング応用a 第13回 『抽象クラス・抽象メソッド1』 13-3. 問題提起2(交通シミュレーションの例) |
【13-3. 問題提起2(交通シミュレーションの例)】
もうひとつ,同じ様な不具合が起きるケースとして,簡単な
交通シミュレーションの例を紹介する。
(この例は,finalメソッドの使用例も兼ねている…以下のソースコードの③)
TrafficSimulator.java
この交通シミュレーションでは,
・
乗り物一般を表すスーパークラス Vehicle
・自動車を表す
Car (Vehicleのサブクラス)
・バイクを表す
Motorbike (Vehicleのサブクラス)
を定義している。大事なのは,move( ) メソッドで,これは受け取った秒数だけその乗り物を移動させるメソッドである。
当然ながら,
・Carクラスでは move( ) メソッドは自動車の移動の仕方を真似た動作をするように定義される。
・Motorbikeクラスでは move( ) メソッドはバイクの移動の仕方を真似た動作をするように定義される。
さて,最後の TrafficSimulator クラスの main( )メソッドで,for文を使って1時間(3600秒間)だけ,
・Car型オブジェクト v1
・Motorbike型オブジェクト v2
・Vehicle型オブジェクト v3
の各 move( ) メソッドを呼び出して交通シミュレーションを行っている。
しかし,スーパークラス Vehicle の move( )メソッドは「何もしないように」定義されているので,動かずにその場にとどまっていることになる。
交通シミュレーションを行っているのに,正体不明の乗り物が一箇所に留まっているのである。精緻な交通シミュレーションだったら,渋滞が
起きてしまうだろう。
この例も,乗り物一般を表すスーパークラス Vehicle が具体的な振る舞いを定義できないために,Vehicle型オブジェクトを生成して動作させた
ために不具合が起きているのである。
やはり,ここであげた Vehicleや,先ほど例にあげたRPGCharacterのような,具体的な振る舞いが定義できない(=メソッドの処理が具体的に書けない)
スーパークラスのオブジェクトは生成されてはいけない,ということになる。
そして,この問題を解決するのが次に紹介する抽象クラスと抽象メソッドである。