结构
类没有有参构造函数,需要调用者自己初始化。
struct Point {
var x: Int = 0
var y: Int = uninit
var z: Int
}
var p = Point { .y = 1 }
初始化的语法叫做with块,不同于C的命名初始化。with块可以包含任何语句,并且可以用在非初始化场景。例如
var point = Point { .y = 1 }
point {
.x = 2; if (a) { .y = 3 }
}
方法
- 类型可以由方法,非静态成员函数,有一个隐藏的this指针。
- 方法必须出现在数据成员之后。
- this的可变性修饰在函数名称后,例如:
struct Point {
fun length() const : Float {
...
}
}
静态成员
struct可以包含静态函数和字段。静态函数没有隐式的this指针。
strcut Point {
static fun foo() {
}
}
Point::foo()
继承
- 不支持多继承,类似于Java
- 被继承的类需要标记为
virtual或者abstract - Trait相当与Java的interface,不能有数据成员和方法实现。
- 继承的分号后面必须先写类(如果有)再写Trait。
- 重写父类的virutal或者abstract方法时,需要加
override标记。 - 使用
super关键字调用父类方法。
virtual strcut B {
virtual fun foo() {}
}
trait I {
abstract fun foo2();
}
struct A : B , I {
override fun foo2() {}
}
构造函数和析构函数
Sric没有C++类似的构造函数,只有默认构造函数,不能有参数。例如
struct A {
fun new() {
}
fun delete() {
}
}
Sric绝大部分情况是不需要写析构函数的,因为所有权机制会自动清理内存。
构造函数是为了弥补原地初始化不能写复杂逻辑的问题。例如可以用三个点的语法,在构造函数中初始化。
struct A {
var p : own* Int = ...;
fun new() {
p = new Int
}
}