Skip to content

Commit 4a5fea8

Browse files
committed
类型委托
1 parent 9a76cd8 commit 4a5fea8

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

docs/.vitepress/config.mts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,8 @@ export default defineConfig({
843843
markdown: {
844844
languages: [mcfpp, mcf],
845845

846+
lineNumbers: true,
847+
846848
shikiSetup: async (shiki) => {
847849
await shiki.loadLanguage(mcfpp, mcf)
848850
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
lastUpdate: true
3+
---
4+
5+
# 类型委托
6+
7+
通过一种特殊的定义,数据模板可以将自己委托给任何的另一种数据类型。
8+
9+
使用`as`关键字来定义一个类型委托。
10+
11+
```mcfpp
12+
data 数据模板名 as 类型 {
13+
# 数据模板成员
14+
}
15+
```
16+
17+
使用了委托的数据模板中会自动生成一个名为`value`的私有字段,类型即为委托的类型。同时,这个数据模板将不再能定义新的字段。。随后,这个数据模板可以通过显式转换的方式,直接转换为委托的类型。
18+
19+
20+
假设我们有一个数据模板`Test`,其中只有一个`int`类型的成员`value`
21+
22+
```mcfpp
23+
data Test{
24+
value as int;
25+
}
26+
27+
var test as Test = {
28+
"value": 1
29+
};
30+
```
31+
32+
在储存的时候,这个数据模板变量的nbt会被储存为`test:{value: 1}`
33+
34+
但是如果我们使用类型委托:
35+
36+
```mcfpp
37+
data Test as int;
38+
39+
var test as Test = Test(1);
40+
41+
```
42+
43+
此时,`test`的nbt会被储存为`test: 1`。也就是说,使用了类型委托的数据模板,在nbt储存方面上,等价于被委托的类型。
44+
45+
使用了数据委托的数据模板会默认生成一个参数为委托类型的构造函数。
46+
47+
虽然不能再定义字段,但是仍然可以在这个数据模板中定义函数,并且你可以在函数中使用`this.value`来访问委托的值。
48+
49+
```mcfpp
50+
data Test as int {
51+
func getValue() -> int {
52+
return this.value;
53+
}
54+
}
55+
56+
var test as Test = Test(1);
57+
print(test.getValue()); # 1
58+
59+
```
60+
61+
委托虽然在储存上等价于被委托的类型,但是在使用上仍然是一个独立的类型。也就是说,`Test``int`是两个不同的类型,不存在继承关系。`Test`不会继承`int`的任何成员,而是默认继承于`any`类型。并且,使用了数据委托的数据模板不再能继承其他的数据模板。
62+
63+
```mcfpp
64+
data Test as int: Parent { # [!code error] #错误,缺少初始化表达式,无法推断
65+
func getValue() -> int {
66+
return this.value;
67+
}
68+
}
69+
70+
var test as Test = Test(1);
71+
print(test.getValue()); # 1
72+
print(test + 1); # [!code error] #错误,Test并未继承int,因此没有实现+运算符
73+
print((test as int) + 1); # 2
74+
```

0 commit comments

Comments
 (0)