オーバーライド

2009年4月16日 23:04

便利!
共通部分をスーパークラスに定義することで、
サブクラスは各々のユニークな機能のみ定義すればよい!スマート!


ボタンの元となるスーパークラスBtnを定義し、
サブクラスとしてBtn1、Btn2を定義した。
オーバーライドしているのは座標情報と表示されるテキストの設定部のみ。

//~ 中 略 ~

import flash.display.*;
import flash.text.*;
import flash.events.*;
// ------------------------------------------------
// ボタンのスーパークラス
// ------------------------------------------------
class Btn extends Sprite {
    //サブクラスで使用する変数やメソッドはprotectedで宣言してやる
    protected var _sx:Number = 50;          //ボタンのx座標
    protected var _sy:Number = 250;    //ボタンのy座標
    protected var _sw:Number = 100;    //ボタンの縦サイズ
    protected var _sh:Number = 30;     //ボタンの横サイズ
    protected var _label:String;       //ラベル
    protected var _messageText:String; //表示テキスト

    public function Btn() {
        init();
        makeBtn();
    }

    //↓ サブクラスでこいつがオーバーライドされる
    internal function init():void {
        _label = "スーパークラス";
        _messageText = "スーパークラスだよ";
    }

    protected function makeBtn():void {
        //ボタン背景
        var square:Shape = new Shape();
        square.graphics.beginFill (0x000000, 1);
        square.graphics.drawRect(_sx, _sy, _sw, _sh);
        addChild(square);

        //テキストフォーマット設定
        var tFmt:TextFormat = new TextFormat();
        tFmt.color = 0xFFFFFF;
        tFmt.size = 12;
        tFmt.align = TextFormatAlign.CENTER;

        //テキスト設定
        var tFld:TextField = new TextField();
        tFld.defaultTextFormat = tFmt;
        tFld.text = _label;
        tFld.width = _sw;
        tFld.height = tFld.textHeight + 4;
        tFld.x = _sx;
        tFld.y = _sy + _sh/2 - tFld.textHeight/2 - 2;
        tFld.selectable = false;
        addChild(tFld);

        addEventListener(MouseEvent.MOUSE_DOWN, function():void{
                y = 2;
                var msgTFld:TextField = new TextField();
                msgTFld.text = _messageText;
                FlashTest(root).tFld = msgTFld;
            });
        addEventListener(MouseEvent.MOUSE_UP, function():void{y = 0});
    }
}

// ------------------------------------------------
// ボタンのサブクラス 1
// ------------------------------------------------
class Btn1 extends Btn {
    public function Btn1() {
    }

    //initメソッドをオーバーライド
    override internal function init():void {
        _label = "ボタン1";
        _messageText = "サブクラス1だよ";
        _sx = 180;
    }
}

// ------------------------------------------------
// ボタンのサブクラス 2
// ------------------------------------------------
class Btn2 extends Btn {
    public function Btn2() {
    }

    //initメソッドをオーバーライド
    override internal function init():void {
        _label = "ボタン2";
        _messageText = "サブクラス2だよ";
        _sx = 310;
    }
}

ちなみにアクセス制御の属性は以下の通り。

  • internal(デフォルト)
    同じパッケージ内のクラスから、アクセス可能。
    クラスやプロパティ・メソッドにとくにアクセス制御の属性を指定しなければ、
    internalとして扱われる(但し、コンストラクタを除く)。
  • private
    定義されたクラス内からのみ、アクセス可能。
  • protected
    定義されたクラスとそのサブクラスからのみアクセス可能
  • public
    任意のクラスやタイムラインからアクセス可能。
    コンストラクタに指定出来るのはこれのみ。

カテゴリー: programming タグ:

コメントはまだありません

No comments yet.

TrackBack URL

Leave a comment