クラスを拡張する
すでにあるクラスを単に流用して使うだけでなく、自分の目的に合わせて機能を修正・追加したい場合、元のクラスを土台にして新しいクラスを定義します。クラスの継承ースーパークラスとサブクラス
別のクラスを元に定義される新しいクラスをサブクラスと言い、 土台になるクラスのことをスーパークラスと呼びます。サブクラスはスーパークラスのフィールド(変数)とメソッド、コンストラクタを受け継ぎます。これを継承(インヘリタンス)と言います。スーパークラスとサブクラスとの間には階層関係が生じ、何階層にも渡って機能を継承する場合もあります。
スーパークラスから機能が継承されるのを、祖先からの遺産の相続と見立てて、スーパークラスのことを親クラス、サブクラスのことを子クラスとも呼びます。
サブクラスを定義するには、次のように定義するサブクラス名に続いて、extendsキーワードとスーパークラス名を書きます。
class サブクラス名 extends スーパークラス名{ // サブクラスで追加するフィールド(変数)とメソッド、コンストラクタの定義 // 変更したいスーパークラスのメソッドの再定義 }
AHamonクラスの拡張
リスト[ClassHamon2]で使った AHamonクラスでは、描かれる波紋の色はAHamonクラスとは無関係で、display()メソッドが実行された時に指定されていた描画色に依存します。AHamon自身に色情報をもたせ、その色で描画されるようにAHamon クラスの機能を拡張してみます。色の情報を保存するための変数を追加し、その値を使って描画色をstroke()関数で設定します。フィールド(変数)の追加 float value1; float value2; float value3; これらは ・カラーモードがRGB(デフォルト)なら赤、緑、青の色の要素 ・カラーモードがHSBなら色相、彩度、明度の色情報 として使う。 コンストラクタの追加 色を指定できるコンストラクタを追加定義 AHamon(float limit, float v1, float v2, float v3) 引数 limit:波紋の最大の直径 v1, v2 ,v3はその時のcolorMode()の指定によって意味が異なる。 デフォルトではRGBの色指定で、0-255の間の値。 v1:赤の要素、v2:緑の要素、v3:青の要素。 displayメソッドの再定義 保存している色情報で描画するように、display()メソッドを定義。 display()メソッドは親クラスAHamonにあるが、そのままでは色指定ができない。 親クラスから継承するメソッドの機能を変更したい時は、子クラスでそのメソッドを再定義する。
上のような機能拡張をしたAColorHamonクラスを、AHamonクラスをスーパークラスとして定義したのがリスト[AColorHamonクラス]です。
サブクラスのコンストラクタの定義は、スーパークラスのコンストラクタの呼出しから始めます。まず、親クラスのオブジェクトができてから、子クラス独自の処理を進める必要があるからです。スーパークラスのコンストラクタの呼出しは、super(引数)と書きます。
AColorHamon(float limit){ super(limit); ←スーパークラスのコンストラクタの実行 }また、メソッドの定義内で、superと書くと、スーパークラスを意味します。
void display(){ ....... super.display(); ←スーパークラスのdisplay()メソッドの実行 }
【リスト AColorHamonクラス】 class AColorHamon extends AHamon { float value1; //red デフォルト値は0 float value2; //green デフォルト値は0 float value3; //blue デフォルト値は0 AColorHamon(float limit) { //デフォルトの色情報を使うコンストラクタ super(limit); //親クラスAHamonクラスのコンストラクタを実行 } AColorHamon(float limit, float v1, float v2, float v3) { super(limit); //superは親クラスを意味する。AHamonクラスのコンストラクタを実行 value1 = v1; //引数で渡された色情報を設定 value2 = v2; value3 = v3; } void display() { stroke(value1, value2, value3); //描画色を設定 super.display(); //親クラスのdisplay()を実行 } }
拡張されたAColorHamonクラスを使う
50個の波紋がランダムな位置に描かれるプログラムClassHamon2と同様に、AColorHamonクラスを使って、色と大きさの異なる50個の波紋が広がるプログラムを作ります。AColorHamonオブジェクトを生成する時、波紋の最大値と、青色要素をランダムな値に指定します。下のClassHamon3では、アクセントをつけるために10個に1個の割合で波紋の色を赤色にしました。
for(int i=0; i<N; i++){ if(i % 10 == 0) { //iが10の倍数であったら、赤 hamon[i] = new AColorHamon(random(100,200), 200, 0, 0); }else { // 青系 hamon[i] = new AColorHamon(random(100,200), 0, 0, random(70,200)); // 青色要素を70-200の間でランダムに決める } }
クリックで開始⇔停止
【リスト ClassHamon3】 AColorHamon[] hamon; //オブジェクト配列 int h; //いくつめの波紋か int N=50; //作り出す波紋の数 void setup() { size(250, 250); frameRate(10); hamon = new AColorHamon[N]; for(int i=0; i<N; i++){ if(i % 10 == 0) { hamon[i] = new AColorHamon(random(100,200), 200, 0, 0); }else { hamon[i] = new AColorHamon(random(100,200), 0, 0, random(70,200)); } } } void draw() { //draw()の中身は、リスト[ClassHamon2]と同じ strokeWeight(0); //背景画面の四角には線を付けない fill(255, 55); //色は白、透明度を指定 rect(0,0,width, height); //背景を四角で塗りつぶす if(!hamon[h].move){ //h番目の波紋が動いていなかったら hamon[h].prepare(random(width), random(height)); //新しい位置で、波紋を開始 h = (h+1)%hamon.length; //hに1加える。0-49の間の数にする //この行は、h = (h+1)%N; と書いても同じ } for(int i=0; i<N; i++){ hamon[i].display(); } }