# 7. 类型与类 类型描述值的结构及其允许的用法。类型标注用于字段、函数参数和返回值,使不同应用部分能够依据同一声明理解数据。 ## 7.1 类型标注 类型标注采用 `名称: 类型` 的形式: ```text price: Int name: String ``` 本文示例使用: | 类型名 | 表达的值 | | --- | --- | | `Int` | 整数 | | `String` | 字符串 | | 用户声明的类名 | 属于该声明类型并满足字段约束的数据 | 数值范围、其他基础类型、可选类型和转换规则尚未构成完整类型体系,范围见[规范状态](../appendices/specification-status.md#声明与类型)。 ## 7.2 class 声明 代码归属:`alice:shop.data`。 ```endorphin class Product { name: String price: Int } ``` 该声明定义名为 `Product` 的数据结构,含有两个字段:`name` 为字符串,`price` 为整数。使用 Product 数据的代码依据同一结构读取字段,不需要为前端另写一份对应结构。 类名是标识符。类体由字段声明组成,每个字段写出名称和类型,字段之间不使用逗号或分号。 ## 7.3 类型与值 `Product` 表示一个声明的类型;具有 Product 类型并满足其字段约束的值,才包含本次业务数据。仅有相同字段不自动使其他类型的值成为 Product。 类声明本身不取得某件商品,也不指定数据库、表或连接。通过类型取得数据的用法在[数据读取](10-data-access.md)中说明;构造、方法与默认值属于独立的类型规则。 ## 7.4 字段访问 函数体片段;局部名称 `product` 表示已取得的 Product 值: ```endorphin let name = product.name let price = product.price ``` 成员访问使用点号。第一行取得字符串字段,第二行取得整数字段。字段使用的类型由声明决定;读取不存在的字段不是有效的 Product 用法。 成员访问和 let 的表达式规则见下一章。 ## 7.5 类型检查与共享 Preflight 理解类和字段声明,检查字段访问、函数参数与返回值的类型关系。inflight 中取得和使用的数据必须符合对应类型及字段约束。 跨 namespace 引用类时,引用的是定义该结构的声明,不改变调用方代码的归属。声明是否可访问取决于可见性和权限规则,见[程序结构与导入](04-program-structure.md)。 ## 7.6 类型身份与兼容 Endorphin 不采用仅依据成员结构判断兼容的结构类型规则。用户声明的类型按其声明身份区分;字段或方法相同,不自动建立类型兼容或能力实现关系。 类型声明通过所属 namespace 与声明定位。引用同一个声明不创建新类型;不同声明不能仅凭名称或成员相同被认定为同一类型。 代码归属:`alice:shop.data`。沿用本章 Product 声明,并增加以下类声明: ```endorphin class ListedProduct { name: String price: Int } ``` Product 与 ListedProduct 都有 name 和 price,但它们是不同的类型。本例没有建立继承、转换或其他兼容关系,因此 ListedProduct 值不能自动作为 Product 参数使用。 ```text Product 值 → 接收 Product 的参数:类型符合要求 ListedProduct 值 → 接收 Product 的参数:不能仅凭字段相同通过检查 ``` 构造某个声明类型的值时仍须检查字段及其类型;这类检查不等于允许不同类型按结构互换。类型推断也不要求结构兼容,具体推断规则仍待定义。 继承、接口或协议关系、显式能力实现及类型转换的规则另行定义,见[规范状态](../appendices/specification-status.md#声明与类型)。本节不增加相应关键字或写法。 [上一章:词法结构](06-lexical-structure.md) · [下一章:表达式与绑定](08-expressions-and-bindings.md) · [目录](../README.md)