プロパティ 記述例 - masaharu-kato/SynC GitHub Wiki

プロパティ 記述例


クラスの作成・メンバの指定

  • 新しいクラスTestを作成 Test;

  • widthが192, heightが128 の2要素(メンバ)を持つクラスSample01を作成 Sample01 (width:160; height:108); このとき、Sample01.width = 160、 Sample01.height = 108 となる。


定義

  • 先頭に#を付けると、クラスの定義を行うことができる。
  • 新しいクラスTestを定義 # Test;

表記方法 識別子の区切りの部分では自由に空白や改行を入れることができる。

Sample01 (
    width : 192;
    height : 128;
);

セミコロンの省略 行末のセミコロンは省略できる。前のコードは次のように記述できる。

Sample01 (
    width : 192
    height : 128
)

複数行に渡る記述 コロン等の記号が文末にくる場合を除き、複数行に渡り記述する際は行末に \が必要。

Sample01 (
    width :
        192
    height \
        : 128
)

既存クラスの継承

  • 既存のBoxクラスをもとに新しいクラスBox01を作成 Box Box01;

  • 既存のBoxクラスをもとに、width, heightを指定したクラスBox02を作成 Box Box02(width:192; height:128);   なお、()内の区切りは; , どちらも使える。
    すなわち、(width:192; height:128)(width:192, height:128)としてもよい

  • 既存のBox02クラスの height を変更し、numberメンバを追加したクラスBox02kを作成 Box02 Box02k(height:144; number:1234);   このとき、Box02k.width = 192、 Box02k.height = 144、 Box02k.number = 1234となる。(widthはBox02から継承した値となる。)

  • 既存のSample02クラスが、既存のクラスBox02kを継承したクラスNewboxを作成 Box02k Sample02 Newbox; このとき、Newbox.width = 160、 Newbox.height = 108、 Newbox.number = 1234となる。 複数クラスの継承では、左側のクラスが優先される。そのため、widthheightSample02から継承した値となる。


子を持つクラスの作成 既存のクラスPanelから新しいクラスPanel01を作り、その子としてBoxから作った新しいクラスBoxABoxBを持たせる これらは、Panel01::BoxA Panel01::BoxB として参照できる。

Panel Panel01 (
    width: 640;
    height: 480;
    color: #ABCDEF;
) {
    Box BoxA (
        width: 120;
        height: 80;
    );

    Box BoxB (
        width: 160;
        height: 90;
    );
};

先にBoxABoxBを定義してから、それを子にすることもできる。

# Box BoxA (
    width: 120;
    height: 80;
);

# Box BoxB (
    width: 160;
    height: 90;
);

Panel Panel01 (
    width: 640;
    height: 480;
    color: #ABCDEF;
) {
    BoxA;
    BoxB;
};

中括弧の別表記 前のPanel01の定義は次のようにも記述できる。

Panel Panel01 (
    width: 640
    height: 480
    color: #ABCDEF
):
    BoxA
    BoxB
Panel Panel01 (width: 640, height: 480, color: #ABCDEF):
    BoxA
    BoxB
Panel Panel01 (width: 640, height: 480, color: #ABCDEF): BoxA, BoxB

複数クラスの指定 ???????????????



無名クラスの作成 子として追加する場合は、クラス名を省略して追加できる 無名クラスの場合、上から数えたインデックスを用いて クラス名[インデックス] で参照できる。 下の例の場合、widthが120のBoxがPanel01[0]、widthが160のBoxがPanel01[1] として参照できる。

Panel Panel01 (
    width: 640;
    height: 480;
    color: #ABCDEF;
) {
    Box (
        width: 120;
        height: 80;
    );

    Box (
        width: 160;
        height: 90;
    );
};

次のようにも記述できる。

Panel Panel01 (width: 640, height: 480, color: #ABCDEF):
    Box (width: 120, height: 80)
    Box (width: 160, height: 90)

次の例のように、継承をしない無名クラスを作ることもできる。

TestGroup (m0: 100):
    (mA:  90, mB: 140)
    (mC: 160, mD: 120)

同一型の子クラス追加 {}[継承クラス名(メンバ名, ...)] で囲むことで、簡潔に子クラスを追加できる。 指定した値の数が[]で指定したメンバの数に満たない場合、満たない部分は指定されない。 これで追加した子クラスは、クラス名[インデックス] で使用できる。(例:PanelGroup[2])

PanelGroup (color: #FFFFFF)
[Panel(px, py, width, height, color, border)] {
      0,   0, 180, 120, #FFCCCC
    120,  80, 320, 280
    170, 210, 180, 320, #DDDDFF, 1
};

これは次と同様である。

PanelGroup (
    color: #FFFFFF;
) {
    Panel (px:  0; py:  0; width:180; height:120; color:#FFCCCC);
    Panel (px:120; py: 80; width:320; height:280);
    Panel (px:170; py:210; width:180; height:120; color:#FFCCCC; border:1);
};

応用として、下記のようなファイル panels.csv を用意すると、

0, 0, 180, 120, #FFCCCC
120,  80, 320, 280
170, 210, 180, 320, #DDDDFF, 1

次のようにcsvを読み込んで利用することができる。

PanelGroup (
    color: #FFFFFF;
) 
[Panel(px, py, width, height, color, border)] @import('panels.csv');

入れ子での定義 同じ系統のクラスをひとまとめにすることができる。 名前空間のように使うこともできる。 使用する場合は クラス名::クラス名 と記述する。

# Tests {
    # Test;
    # Sample;
};
 
Tests::Sample NewSample;

継承を含めた入れ子定義 継承クラスに*を指定すると、親のクラスを意味する。

# Box (
    width: 240;
    height: 160;
) {
    # * Normal (color: #FFFFFF);
    # * Special (color: #FFBBBB);
};

これは次と同様である。

# Box (
    width: 240;
    height: 160;
) {
    # Box Normal (color: #FFFFFF);
    # Box Special (color: #FFBBBB);
};


同名クラス・同名メンバ

  • 同じクラスを複数定義した場合、既存の定義に後の定義が追加される。 同じクラスで同じメンバを複数定義した場合、後のものが優先される。

次の2例は同じ意味となる。上の例であっても、MultiSampleが2つ作成されるわけではない。

BaseA MultiSample (
    mA : 12;
    mB : 35;
);

BaseB MultiSample (
    mB : 45;
    mC : 50;
);
BaseA BaseB MultiSample (
    mA : 12;
    mB : 45;
    mC : 50;
);