クラスを拡張する
すでにあるクラスを単に流用して使うだけでなく、自分の目的に合わせて機能を修正・追加したい場合、元のクラスを土台にして新しいクラスを定義します。クラスの継承ースーパークラスとサブクラス
別のクラスを元に定義される新しいクラスをサブクラスと言い、 土台になるクラスのことをスーパークラスと呼びます。サブクラスはスーパークラスのフィールド(変数)とメソッド、コンストラクタを受け継ぎます。これを継承(インヘリタンス)と言います。スーパークラスとサブクラスとの間には階層関係が生じ、何階層にも渡って機能を継承する場合もあります。
スーパークラスから機能が継承されるのを、祖先からの遺産の相続と見立てて、スーパークラスのことを親クラス、サブクラスのことを子クラスとも呼びます。
サブクラスを定義するには、次のように定義するサブクラス名に続いて、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();
}
}