编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

仓颉编程语言基础-面向对象编程-类

wxchong 2025-08-05 22:00:52 开源技术 5 ℃ 0 评论

仓颉中同样支持使用 class 来实现面向对象编程

核心特性

  • 引用类型:类是引用类型,赋值或传参时传递引用(多个变量指向同一对象)。
  • 继承支持:支持单继承(通过 <: 符号),子类继承父类非私有成员。
  • 抽象类:用 abstract 修饰,可包含抽象函数(无函数体),不可实例化。
  • 密封类:用 sealed 修饰的抽象类,仅允许同包内的子类继承。

类定义与结构

以关键字 class 开头,后跟 class 的名字,接着是定义在一对花括号中的 class 定义体。class 定义体中可以定义一系列的成员变量、成员属性(参见属性)、静态初始化器、构造函数、成员函数和操作符函数。

class ClassName {
    // 成员变量(实例/静态)
    let width: Int64       // 实例变量
    static let count: Int  // 静态变量
    // 构造函数
    public init(w: Int64) { 
        this.width = w 
    }
    // 成员函数
    public func area() { ... }
    // 终结器(垃圾回收时触发)
    ~init() { ... } 
}

成员变量分为实例成员变量和静态成员变量:

  • 静态成员变量:使用 static 修饰符修饰,没有静态初始化器时必须有初值,只能通过类型名访问。
  • 实例成员变量:定义时可以不设置初值(但必须标注类型),也可以设置初值,只能通过对象(即类的实例)访问。

成员函数同样分为实例成员函数和静态成员函数(使用 static 修饰符修饰):

  • 实例成员函数:只能通过对象访问,实例成员函数中可以访问静态成员变量以及静态成员函数。根据是否有函数体,实例成员函数又可以分为抽象成员函数和非抽象成员函数。
  • 静态成员函数:只能通过 class 类型名访问,静态成员函数中不能访问实例成员变量,也不能调用实例成员函数。

关键函数

  • 主构造函数:与类同名,有两种形式的形参:普通形参和成员变量形参(需要在参数名前加上 let 或 var)。
  • 普通构造函数:init 开头,需初始化所有未赋值实例成员变量。一个类中可以定义多个普通构造函数,但它们必须构成重载。
  • 终结器:~init(),用于资源清理(如释放内存),有严格使用限制。
  • 静态初始化器:static init(),初始化所有静态成员变量,每个类最多一个。
  • This 类型:代表当前类类型,用于成员函数返回类型(子类调用时返回子类类型)。

继承与多态

  • 继承规则:父类需用 open 修饰才可被继承(抽象类总是可被继承的)。子类通过 super(args) 调用父类构造函数。在子类定义处通过 <: 指定其继承的父类,但要求父类必须是可继承的。仅支持单继承。
  • 函数覆盖:覆盖实例函数:父类函数用 open,子类用 override。重定义静态函数:子类用 redef。
  • 动态派发:子类对象赋值给父类变量时,调用方法按实际类型决定。

访问控制

  • 修饰符:private(仅类内)→ internal(同包及子包,默认)→ protected(子类可见)→ public(全局)。
  • 抽象函数:必须为 public 或 protected,不可 private。

与结构体(struct)的区别

特性

类(class)

结构体(struct)

类型

引用类型

值类型

继承

支持

不支持

赋值/传参行为

传递引用(共享对象)

复制值(独立副本)


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表