类
Alia 语言支持面向对象编程,通过 class 关键字定义类。
1. 类的定义
基本语法
class <Key name> <Object body> ~ 类定义
class <Key name> extends <Key parent> <Object body> ~ 类继承
class <Key name> *[key: value, ...] ~ 可变类(体尾部 `...`)
示例:
class Person *[
name: ''
age: 0
new: alias <String name> <Number age> -> {
self.name = name
self.age = age
self
}
]
new 方法返回 self,即当前实例对象;实例化的结果由该返回值决定。
类表达式(匿名类)
省略类名时,class *[body] 作为表达式求值,返回类体对象(匿名类),常配合 let/const 赋值使用:
const Greeter = class *[
name: String
new: alias <String n> -> {
self.name = n
self
}
greet: alias -> {
'Hello ' .. self.name
}
]
const g = new Greeter ['Alia']
print (call g.greet) ~ Hello Alia
可变性由类体尾部 ... 声明(不再使用 mut 修饰符):尾部带 ... 的类允许新增/删除实例属性,缺省则结构固定。
class Point *[
x: 0
y: 0
...
]
const p = new Point
p.x = 5
print p.x ~ 5
p.z = 1 ~ Point 为可变类,可新增属性
数组/对象字面量的尾部 ... 同样声明可变容器:
const nums = [0, 1, 2, ...] ~ 可变数组
const bag = *[a: 1, ...] ~ 可变对象
备注
mut {} / mut *{}(可变栈)语法不受影响,它与类型的可变性无关。
2. 类的实例化
new 关键字实例化一个类,支持无参、数组参数与对象参数三种传参方式:
class Person *[
name: ''
age: 0
new: alias <String name> <Number age> -> {
self.name = name
self.age = age
self
}
]
const p1 = new Person ~ 无参实例化
const p2 = new Person ['Alice', 30] ~ 数组参数:按构造函数形参顺序传参
const p3 = new Person *[name: 'Alice', age: 30] ~ 对象参数:按构造函数形参名传参
对象式调用中,键名优先与 构造函数形参名对应并转发;与形参名不匹配的键在构造完成后直接作为实例成员初始化。
类未定义 new 方法时启用默认构造:以类体全部成员(含继承链上的父类成员)初始化实例,实参数组按序号键('0'、'1'…)初始化,对象实参按键名初始化:
class Point *[x: 1, y: 2]
const p1 = new Point ~ { x: 1, y: 2 }
const p2 = new Point [3] ~ { x: 1, y: 2, '0': 3 }
const p3 = new Point *[x: 3] ~ { x: 3, y: 2 }
类体成员可声明类型注解,注解在运行时求值为 Null 且不生成字段初始化器,仅供类型检查与格式化消费。结构化形态与裸内置类型名均按注解处理:
class BigNum *[
digits: [Number, ...] ~ self.digits[i] 按 Number 检查,push 等变长操作可用
tag: Number | String
fallback: Number?
name: String ~ 裸内置类型名同样按注解处理
]
构造函数形参带关键字时,支持语法式调用,即按构造函数形参模式直接书写:
class Person *[
name: ''
age: 0
new: alias named <String name> aged <Number age> -> {
self.name = name
self.age = age
self
}
]
const alice = new Person named 'Alice' aged 30
实例化使用上述调用形式,不支持 new Person(...) 的函数式写法。