
回复
在HarmonyOS Next开发中,类(Class)作为面向对象编程的核心载体,承担着数据封装与行为定义的双重角色。本文结合《仓颉编程语言开发指南》,从类的基础定义、对象生命周期及继承机制出发,解析如何通过类构建健壮的应用模型。
类通过class
关键字定义,包含成员变量、构造函数、成员函数等,是数据与行为的封装单元。
// 定义矩形类
open class Rectangle {
public var width: Int64 // 公开实例变量
private var height: Int64 // 私有实例变量
// 主构造函数:初始化成员变量
public Rectangle(let width: Int64, let height: Int64) {
this.width = width
this.height = height
}
// 公开成员函数:计算面积
public func area(): Int64 {
width * height
}
// 静态变量:所有实例共享
public static var count: Int64 = 0
}
let width: Int64
);init
声明,支持重载:
public init(side: Int64) {
this.width = side
this.height = side // 正方形初始化
}
public init(width: Int64, height: Int64) { ... } // 重载构造函数
类是引用类型,对象赋值传递引用而非复制:
let rect1 = Rectangle(width: 10, height: 20)
let rect2 = rect1 // rect1与rect2指向同一对象
rect1.width = 15
println(rect2.width) // 输出15,引用类型特性
static init
块初始化复杂静态资源:
static let defaultPath: String
static init() {
defaultPath = getSystemPath() // 静态初始化器
}
~init
释放非托管资源(如C语言内存):
private var ptr: UnsafePointer<CChar>?
init(size: Int) {
ptr = malloc(size) // 分配内存
}
~init() {
ptr?.deallocate() // 终结器自动释放内存
}
使用is
和as
操作符进行类型检查与转换:
let obj: Any = Rectangle(width: 5, height: 5)
if obj is Rectangle {
let rect = obj as! Rectangle // 安全转换(需确保类型正确)
println(rect.area())
}
HarmonyOS Next支持单继承,子类通过<:
关键字继承父类,继承规则如下:
private
成员和构造函数外,均可继承;open
成员函数:
public open func speak(): String { "声音" }
public override func speak(): String { "汪汪" } // 覆盖父类方法
super()
)或本类其他构造函数(this()
):
public init() {}
public init(radius: Int) {
super() // 调用父类无参构造函数
}
public init(value: Int) {}
public init() {
super(value: 0) // 必须调用父类带参构造函数
}
abstract func
),子类必须实现所有抽象成员;sealed
类:禁止继承,用于封闭实现细节:
open class Device {
public var deviceId: String
public var status: DeviceStatus = .Offline // 枚举状态
public init(deviceId: String) {
self.deviceId = deviceId
}
// 抽象函数:子类实现状态更新
public abstract func updateStatus() -> Bool
}
enum DeviceStatus { .Online, .Offline, .Updating }
class SmartBulb <: Device {
private var brightness: Int = 0
public init(deviceId: String, brightness: Int) {
self.brightness = brightness
super.init(deviceId: deviceId)
}
public override func updateStatus(): Bool {
status = .Online
println("灯泡\(deviceId)已上线,亮度\(brightness)")
return true
}
// 新增成员:调节亮度
public func setBrightness(level: Int) {
brightness = level
if status == .Online {
sendCommand("brightness=\(level)")
}
}
}
let bulb = SmartBulb(deviceId: "bulb_001", brightness: 50)
bulb.updateStatus() // 调用子类实现
if bulb is Device {
let device: Device = bulb // 向上转型
println("设备状态:\(device.status)") // 输出 Online
}
let x: Int = 10
let y: Int = x + 5 // 合法:成员变量按声明顺序初始化
open
类;当功能复用需求较弱时,使用组合模式(如包含接口类型成员)替代继承:
class NetworkDevice {
private let communicator: Communicator // 组合接口对象
public func send(data: String) {
communicator.transmit(data) // 委托给组合对象
}
}
HarmonyOS Next的类设计遵循“封装变化,保留稳定”的原则:
public
/private
)隐藏实现细节;