Section 2.8 多重継承(その1)

今回も継承関係の話なんだけど、ちょっとその前にやっときたい事があるんだ。
…もしかしてまた前置き長いの?
ん〜、まぁでも前回ほどじゃないから。
はぁ…
で、やっときたい事って?
前回は、ファイルを選択するクラスを作ったよね。
うん。SimpleFileSelector クラスと、テキストファイル用の TextFileSelector クラスを作ったね。
今回はまず「ファイルを開く」と「名前をつけて保存」の両方を使える FileSelector クラスを作るところから始めようと思うんだ。
それって SimpleFileSelector クラスを継承して作るの?
ううん。FileSelector クラスは今回の本題と直接関係ないから SimpleFileSelector クラスを書き換えて作るよ。
りょーかい。
じゃ、作ってみて。
え、わたしが作るの?
ん。ここしばらく説明だけだったからね。
そーいえばそうだね。
うん、じゃ作ってみるね。
コンストラクタとデストラクタ、あとプロパティは SimpleFileSelector クラスと同じでいいから省略するね。
うん、わかった。
じゃ、まずは getParams メソッドから。
前回は引数なしだったけど、今回はダイアログボックスの種類を指定する引数をつけてね。
ダイアログボックスの種類って?
引数が true だと「名前をつけて保存」で、 false だと「ファイルを開く」にするってこと。
あ、そういうことね。
えーっと、じゃあ…

getParams メソッド>

// selectFile メソッドに渡す辞書配列を返します
function getParams(save)
{
    var params = new Dictionary();

    params.filter = ["すべてのファイル(*.*)|*.*"];  // すべてのファイルを表示します
    params.initialDir = System.exePath;  // krkr.eXe があるフォルダを初期状態で表示するフォルダに指定します
    params.save = save;  // ダイアログボックスの種類を指定します

    return params;
}

こう?
うん、OK。
じゃあ次は SimpleFileSelector クラスの openFile メソッドをベースにして、 ファイル選択ダイアログボックスを表示する showDialog メソッドを作ってみて。
引数は getParams メソッドと同じにしてね。
それって、引数が true だったら「名前をつけて保存」の方を表示して、 false だったら「ファイルを開く」の方を表示するってこと?
そうそう、そういうこと。
ってことは、引数をそのまま getParams メソッドに渡せばいいんだから…

showDialog メソッド>

// ファイル選択ダイアログボックスを表示します
// 引数が真なら「名前をつけて保存」、偽なら「ファイルを開く」ダイアログボックスを表示します
// ファイルが選択された場合は、選択されたファイル名を fileName にセットして真を返します
// 『キャンセル』ボタンが押された場合は何もせず偽を返します
function showDialog(save)
{
    var params = getParams(save);  // selectFile メソッドに渡す辞書配列を取得します

    if(!Storages.selectFile(params))  // ファイル選択ダイアログボックスを表示します
        return false;  // 『キャンセル』ボタンが押されたので偽を返します

    fileName = params.name;  // 選択されたファイル名を fileName にセットします

    return true;
}

こんな感じかな。
ん、これも OK だね。
じゃあ最後に openFile メソッドと saveFile メソッドを作ってみて。
それぞれ「ファイルを開く」と「名前をつけて保存」ダイアログボックスを表示するメソッドね。
showDialog メソッド使っていいんだよね?
うん、もちろん。
じゃ簡単だね。

openFile メソッドと saveFile メソッド>

// 「ファイルを開く」ダイアログボックスを表示します
// 戻り値は showDialog メソッドと同じです
function openFile()
{
    return showDialog(false);
}

// 「名前をつけて保存」ダイアログボックスを表示します
// 戻り値は showDialog メソッドと同じです
function saveFile()
{
    return showDialog(true);
}

こうだよね。
うん。
まとめると、FileSelector クラスはこうなるね。

FileSelector クラス>

class FileSelector
{
    var fileName;  // 選択されたファイル名を保持するメンバ変数

    // コンストラクタ
    function FileSelector()
    {
        fileName = "";  // fileName を空文字列に初期化します
    }

    // デストラクタ(何もしません)
    function finalize(){}

    // selectFile メソッドに渡す辞書配列を返します
    function getParams(save)
    {
        var params = new Dictionary();

        params.filter = ["すべてのファイル(*.*)|*.*"];  // すべてのファイルを表示します
        params.initialDir = System.exePath;  // krkr.eXe があるフォルダを初期状態で表示するフォルダに指定します
        params.save = save;  // ダイアログボックスの種類を指定します

        return params;
    }

    // ファイル選択ダイアログボックスを表示します
    // 引数が真なら「名前をつけて保存」、偽なら「ファイルを開く」ダイアログボックスを表示します
    // ファイルが選択された場合は、選択されたファイル名を fileName にセットして真を返します
    // 『キャンセル』ボタンが押された場合は何もせず偽を返します
    function showDialog(save)
    {
        var params = getParams(save);  // selectFile メソッドに渡す辞書配列を取得します

        if(!Storages.selectFile(params))  // ファイル選択ダイアログボックスを表示します
            return false;  // 『キャンセル』ボタンが押されたので偽を返します

        fileName = params.name;  // 選択されたファイル名を fileName にセットします

        return true;
    }

    // 「ファイルを開く」ダイアログボックスを表示します
    // 戻り値は showDialog メソッドと同じです
    function openFile()
    {
        return showDialog(false);
    }

    // 「名前をつけて保存」ダイアログボックスを表示します
    // 戻り値は showDialog メソッドと同じです
    function saveFile()
    {
        return showDialog(true);
    }

    // 選択されたファイル名を取得するための読み取り専用プロパティ
    property name
    {
        getter()
        {
            return fileName;
        }
    }
}

はい、これで前置きは終わり。
じゃ本題に入るね。
今回の前置きも結構長かったね…
前回よりは短かったでしょ。
まぁ、それはそうだけどねぇ…
で、今回は多重継承の話。
多重継承?
多重継承っていうのは、スーパークラスが2つ以上ある継承のこと。
なんか複雑そうだね…
まぁ普通の継承よりはね。
じゃあ、できるだけシンプルになるようにスーパークラスが2つの場合を説明するね。
うん、わかった。
まず1つ目のスーパークラスは、辞書配列の内容をファイルに保存する DictionarySaver クラス。

DictionarySaver クラス>

class DictionarySaver
{
    // コンストラクタ(何もしません)
    function DictionarySaver(){}

    // デストラクタ(何もしません)
    function finalize(){}

    // 辞書配列をファイルに保存します
    // 第1引数:保存する辞書配列
    // 第2引数:保存するファイル名
    // 戻り値はありません
    function save(dic, fileName)
    {
        (Dictionary.saveStruct incontextof dic)(fileName);
    }
}

§1.15 でも辞書配列のメソッドを使ったけど、 これって書き方がややこしいんだよねぇ。
まぁね。
ちなみにこの書き方とか incontextof 演算子は、多重継承の説明が終わったら説明するつもりだけどね。
え、そうなの?
うん、一応ね。
う〜ん、色々知っとかなきゃいけないことがあるんだね…
あ、ところで saveStruct って初めて見るメソッドだよね?
saveStruct は辞書配列の中身をファイルに保存するメソッドだよ。
引数には保存するファイル名を指定するんだ。
辞書配列ってどうやってファイルに保存するの?
辞書配列の中身をテキスト形式でファイルに書き出して保存するんだけど、後で実際にやってみるから、その時にまた説明するね。
うん、りょーかい。
じゃ、次はもう1つのスーパークラス、DictinaryLoader クラス。
これは辞書配列をファイルから読み込むクラスだよ。

DictinaryLoader クラス>

class DictionaryLoader
{
    // コンストラクタ(何もしません)
    function DictionaryLoader(){}

    // デストラクタ(何もしません)
    function finalize(){}

    // ファイルから読み出した辞書配列を返します(ファイルが存在しない場合は void を返します)
    // 引数:読み出すファイル名
    function load(fileName)
    {
        if(!Storages.isExistentStorage(fileName))
            return void;  // ファイルが存在しない場合は void を返します

        return Scripts.evalStorage(fileName);  // ファイルから読み出した辞書配列を返します
    }
}

isExistentStorage メソッドって初めて見るね。
あと、Scripts っていうクラスも今まで使ったことないクラスだよね。
うん。じゃあまず isExistentStorage メソッドから説明するね。
これは Storages クラスのメソッドで、ファイルが存在するかどうかをチェックするメソッド。
じゃあ、ファイルが存在すれば true を返して、存在しなければ false を返すの?
そうそう。
このメソッドで引数に指定されてるファイルが存在するかチェックして、もし存在しなければ void を返してるの。
なるほどねー。
じゃあ、Scripts クラスの evalStorage メソッドってどんなメソッドなの?
Scripts クラスはその名前の通り TJS スクリプトに関係するメソッドを扱ってるクラス。
で、evalStorage メソッドは、引数に指定されてるファイルの内容を TJS 式として読み込むメソッドなんだ。
えっと、じゃあファイルに辞書配列のデータが書いてあったら、evalStorage メソッドを実行するとその辞書配列が返ってくるってこと?
ん、そうだよ。
ちなみに、戻り値がどうなるかはファイルの中身によって決まるんだ。
ファイルに数値が書いてあれば整数型か実数型の値が返ってくるし、文字列が書いてあれば文字列型の値が返ってくるよ。 あと、配列データが書いてあれば配列が返ってくるよ。
へぇ、そうなんだ。
ただし、ファイルに TJS 式と見なせないデータが入ってる場合は例外が起こるから注意してね。
今回はファイルに辞書配列のデータが入ってると仮定してスクリプトを書いてるから。
うん、わかった。
で、この2つのスーパークラスを多重継承して、辞書配列の保存と読み込みができるクラスを作ろうと思うんだけど…
だけど?
それはまた次回ね。
あ、次回に続くんだ?
今回はだいぶ長くなっちゃったからね。まだ先も長いし。
というワケで、続きは次回ね!


前へ | TOP | 次へ