いまさらオブジェクト指向プログラミング(OOP)シリーズ、継承のはなし。
様々な図形を描画するクラスを考える。ぱっと思いつく実現方法は2つ。
(a) どんな図形でも描画できるShapeクラスをつくる。
(b) 図形を扱うShapeクラス(スーパークラス)をつくり、図形の種類毎にShapeクラスを継承したクラス(サブクラス)をつくる。
描画する図形が増えた場合には、
(a)の場合は、Shapeクラスを修正する必要があります。テストもデバッグも終了し、正常に動作していたクラスに手を加えたくないですね。
(b)の場合は、新たな図形のためにShapeクラスを継承したサブクラスを作成します。今まで正常に動作していたShapeクラスや既存の他の図形を描画するサブクラスには、手を加える必要がありません。
デバッグやテスト、既存コードの再利用を考えると、継承を使用した(b)の方が良さそうです。
1 2 3 4 5 6 7 8 |
package { public class Shape { public function Shape() { } public function Draw(): void { } } } |
図形の種類ごとにShapeクラスを継承したサブクラスを作成します。サブクラスは、図形を描画するためのメソッド(Draw)をオーバーライドして、各々の図形が描画されるようにします。
1 2 3 4 5 6 7 8 9 |
package { public class Box extends Shape { public function Box() { } override public function Draw(): void { trace("draw box"); } } } |
1 2 3 4 5 6 7 8 9 |
package { public class Square extends Shape { public function Square() { } override public function Draw(): void { trace("draw square"); } } } |
新たに、丸を描画する必要が発生した際には、以下のようなCircleクラスを作成します。既存のクラスに手を加える必要はありません。
1 2 3 4 5 6 7 8 9 |
package { public class Circle extends Shape { public function Circle() { } override public function Draw(): void { trace("draw circle"); } } } |
メインのタイムライン(1フレーム目)に以下のスクリプトを書くことでクラスの動作を見ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var objBox:Box = new Box(); var objSquare:Square = new Square(); var objCircle:Circle = new Circle(); objBox.Draw(); objSquare.Draw(); objCircle.Draw(); trace("----------"); funcDraw(objCircle); funcDraw(objSquare); funcDraw(objBox); function funcDraw(obj:Shape):void { obj.Draw(); } |
出力パネルには以下のように表示されます。
draw box
draw square
draw circle
———-
draw circle
draw square
draw box
コメントを残す
コメントを投稿するにはログインしてください。