プロパティ 記述例 - 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となる。 複数クラスの継承では、左側のクラスが優先される。そのため、width
とheight
はSample02
から継承した値となる。
子を持つクラスの作成
既存のクラスPanel
から新しいクラスPanel01
を作り、その子としてBox
から作った新しいクラスBoxA
とBoxB
を持たせる
これらは、Panel01::BoxA
Panel01::BoxB
として参照できる。
Panel Panel01 (
width: 640;
height: 480;
color: #ABCDEF;
) {
Box BoxA (
width: 120;
height: 80;
);
Box BoxB (
width: 160;
height: 90;
);
};
先にBoxA
とBoxB
を定義してから、それを子にすることもできる。
# 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;
);