詳細

アクセス・レベル

メソッドには3種類のアクセス・レベルがあります。
アクセス・レベルの記述を省略した場合は、publicになります。

メソッドのアクセス・レベル
アクセス・レベル制限
privateメソッドを宣言したクラスのスコープからのみ使うことができる
protectedメソッドを宣言したクラスのスコープと派生したクラスのスコープで使うことができる
publicすべてのクラスのスコープとグローバル・スコープで使うことができる(デフォルト)

メンバには3種類のアクセス・レベルがあります。
アクセス・レベルの記述を省略した場合は、protectedになります。

メンバのアクセス・レベル
アクセス・レベル制限
privateメンバを宣言したクラスのスコープからのみアクセスできる
protected派生したクラスからアクセスできることを除けば、privateメンバと同じである(デフォルト)
publicすべてのスコープからアクセスできる

メソッド定義例

メソッドの定義はbodyを使うことにより、classの外に置くこともできます。

# 乱数クラス
class Random {
    # コンストラクタ定義
    constructor {} {
	init [expr [clock seconds]+[pid]]
    }
    # デストラクタ定義
    destructor {}
    # メソッド宣言
    protected method init {value}
    # メソッド宣言
    public method getvalue {}
}

# メソッド定義
body Random::init {value} {
    expr srand($value)
    return
}
# メソッド定義
body Random::getvalue {} {
    expr rand()
}

staticメソッド

methodの代わりにprocを使うとstaticメソッドになります。
staticメソッドはクラスのメンバ(staticメンバを除く)にアクセスできない代わりに、
オブジェクトを作成(インスタンス化)しなくてもメソッドを呼び出せます。

# 色クラス
class Color {
    # staticメソッドの定義
    proc RGB {color} {
	switch -- $color {
	red    {set value "255 0 0"}
	green  {set value "0 255 0"}
	blue   {set value "0 0 255"}
	}
	return $value
    }
}

# クラスを指定して呼び出す
Color::RGB red
=> 255 0 0

staticメンバ

variableの代わりにcommonを使うとstaticメンバになります。
staticメンバは、そのクラスのすべてのオブジェクトで共有されます。

# カウンタ・クラス
class Counter {
    # staticメンバの定義
    public common count 0
    # メソッドの定義
    public method incr {} {
	::incr count
    }
}

# 1つ目のオブジェクトを作成
Counter c1
# カウンタのアップ
c1 incr
=> 1
# カウンタの取得
c1 cget -count
=> 1
# 2つ目のオブジェクトを作成
Counter c2
# カウンタの取得
c2 cget -count
=> 1