< メモ: Wireshark のフィルタの書き方忘れちゃったよ! | メモ: プログラミング上の操作の英語での表現 >

November 21, 2008

静的な定数

インスタンス数を制限するクラスを定義する必要がよくある。実装方法のひとつに、コンストラクタを隠蔽して、静的メソッド内でインスタンス数チェックを行いインスタンスを返させる手法が考えられる。というわけで、こんな風に書いたとする。

class Kanjo
{
    // インスタンス数
    private static int instansNum = 0;

    // 三人官女は 3 人まで
    private static const int maxInstansNum = 3;

    // 静的なメソッドよりインスタンスを作成する
    public static Kanjo CreateInstance ()
    {
        // インスタンス数チェック
        if (instansNum < maxInstansNum)
        {
            instansNum++;           // インスタンス数を加算
            return new Kanjo ();    // 官女を作成して返す
        }
        // 例外の種類は適当
        throw new OverflowException ();
    }

    private Kanjo ()
    {
        // 官女の初期化を行う
    }
}

上記のコードはコンパイルできない。「定数 'Kanjo.maxInstansNum' を static に指定することはできません。」というエラーになってしまう。static const なんて C++ だと普通のコードなので少々悩んだ。C# の場合は const をつけた時点で静的メンバになるので、static をつけることが出来ない。const をつけると static がなくとも静的なメソッドからアクセス可能になる。

// static がつかなくても、静的なメソッドからアクセスが可能
const int maxInstansNum = 3;

なんか気持ちわるー。

ちなみに、C# には readonly というキーワードもあるが、こちらはインスタンスが作られるので、下記の記述が可能。

// readonly の場合は static をつけないと静的なメンバにならない
static readonly int maxInstansNum = 3;

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2249

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?