
回复
在HarmonyOS Next开发中,类的继承机制是实现代码复用与多态的核心特性。通过单继承模型,子类能够继承父类的成员(除私有成员外),并通过覆盖(Override)扩展行为。本文结合文档知识点,解析继承的规则、最佳实践及在实际场景中的应用。
HarmonyOS Next支持单继承,子类通过 <:
关键字声明继承父类,语法如下:
open class Parent { /* 父类定义 */ }
class Child <: Parent { /* 子类继承父类 */ }
private
的成员变量、成员函数、静态成员;super()
调用。private
成员(仅限父类内部访问);open class Animal {
public var name: String
protected var age: Int // 受保护成员可被子类访问
public init(name: String, age: Int) {
self.name = name
self.age = age
}
}
class Dog <: Animal {
public var breed: String
public init(name: String, age: Int, breed: String) {
self.breed = breed
super.init(name: name, age: age) // 调用父类构造函数
}
// 访问父类受保护成员
public func getAge() -> Int { age }
}
open
修饰符与继承权限open
类默认不可继承,需显式声明open
:
open
成员允许子类覆盖,非open
成员默认不可覆盖:
public func fixedFunc() {} // 非open,子类不可覆盖
public open func overriddenFunc() {} // open,子类可覆盖
init
声明,支持重载。super()
)或本类其他构造函数(this()
),且需在构造函数体首行调用:
public var speed: Int
public init(speed: Int) { self.speed = speed }
- 若父类无无参构造函数,子类必须显式调用父类带参构造函数:
- ```cj
- open class Parent {
- public init(value: Int) {} // 无默认构造函数
- }
- class Child <: Parent {
- public init() {
- super.init(value: 0) // 必须调用父类带参构造函数
- }
- }
- ```
### 3. 初始化顺序
1. 初始化子类成员变量;
2. 2. 调用父类构造函数;
3. 3. 执行构造函数体逻辑。
**示例**:
```cj
open class A {
public var a = 10 { didSet { println("A.a = \(a)") } }
public init() { a = 20 } // 父类构造函数修改a的值
}
class B <: A {
public var b = a + 5 // 子类成员变量初始化时,父类a已被初始化
public init() {
super.init() // 调用父类构造函数(此时a=20)
b = 30 // 进一步修改b的值
}
}
let b = B() // 输出:A.a = 20
子类可覆盖父类的open
实例函数,需使用override
修饰(可选但推荐显式声明):
open class Shape {
public open func area(): Float64 { 0.0 } // 父类默认实现
}
class Circle <: Shape {
private let radius: Float64
public init(radius: Float64) { self.radius = radius }
public override func area(): Float64 { // 覆盖父类方法
3.14 * radius * radius
}
}
子类可重定义父类静态函数,使用redef
修饰(可选):
open class Utility {
public static func version(): String { "1.0" }
}
class AdvancedUtility <: Utility {
public redef static func version(): String { "2.0" } // 重定义静态函数
}
protected
,子类可public
)。open class DeviceDriver {
public var deviceName: String
public open func connect(): Bool {
println("连接设备:\(deviceName)")
return true // 默认实现
}
public init(name: String) {
self.deviceName = name
}
}
class SerialDriver <: DeviceDriver {
private let port: Int
public override func connect(): Bool { // 覆盖连接逻辑
println("通过串口\(port)连接设备:\(deviceName)")
return super.connect() // 调用父类默认逻辑
}
public init(name: String, port: Int) {
self.port = port
super.init(name: name)
}
}
class NetworkDriver <: DeviceDriver {
private let ip: String
public redef static func version(): String { // 重定义静态版本号
"NetworkDriver v1.2"
}
public init(name: String, ip: String) {
self.ip = ip
super.init(name: name)
}
}
func testDrivers() {
let serial = SerialDriver(name: "COM1", port: 1)
let network = NetworkDriver(name: "Server", ip: "192.168.1.1")
let drivers: [DeviceDriver] = [serial, network]
drivers.forEach { driver in
driver.connect() // 动态调用子类实现
}
println(NetworkDriver.version()) // 输出重定义的静态函数结果
}
输出结果:
通过串口1连接设备:COM1
连接设备:Server
NetworkDriver v1.2
class <: I1 & I2
)或包含对象实例实现多能力整合:
private let printer: Printer // 组合打印机对象
private let connector: Connector // 组合连接器对象
public func printData() { printer.print() }
public func connect() { connector.link() }
sealed
类与封闭设计使用sealed
修饰类,禁止其被继承,适用于工具类或最终实现类:
sealed class FinalLogger { /* 最终日志类,不可继承 */ }
抽象类强制子类实现抽象成员,确保逻辑完整性:
abstract class AbstractParser {
public abstract func parse(data: String): Any // 抽象函数
public func logError(message: String) { /* 具体错误处理 */ }
}
class JSONParser <: AbstractParser {
public override func parse(data: String): Any { /* 实现解析逻辑 */ }
}
HarmonyOS Next的单继承机制在保证代码结构清晰的同时,通过以下方式实现复用与扩展: