有没有一种方法可以用Swift语言创建一个抽象类,或者这和Objective-C一样是一个限制?我想创建一个抽象类,与Java定义的抽象类类似。
最佳答案
Swift中没有抽象类(就像Objective-C一样)。您最好的选择是使用Protocol,它就像一个Java接口。
使用Swift 2.0,您可以使用协议扩展添加方法实现和计算属性实现。唯一的限制是不能提供成员变量或常量,并且没有动态分派。
这种技术的一个例子是:
protocol Employee {
var annualSalary: Int {get}
}
extension Employee {
var biweeklySalary: Int {
return self.annualSalary / 26
}
func logSalary() {
print("$\(self.annualSalary) per year or $\(self.biweeklySalary) biweekly")
}
}
struct SoftwareEngineer: Employee {
var annualSalary: Int
func logSalary() {
print("overridden")
}
}
let sarah = SoftwareEngineer(annualSalary: 100000)
sarah.logSalary() // prints: overridden
(sarah as Employee).logSalary() // prints: $100000 per year or $3846 biweekly
注意,这甚至为结构提供了类似“抽象类”的特性,但是类也可以实现相同的协议。
还要注意,实现Employee协议的每个类或结构都必须再次声明annualSalary属性。
最重要的是,注意没有动态调度。当对存储为
logSalary
的实例调用SoftwareEngineer
时,它将调用方法的重写版本。当实例被转换为logSalary
后对其调用Employee
时,它调用原始实现(即使实例实际上是Software Engineer
,它也不会动态分派到重写版本)。有关详细信息,请查看有关该功能的精彩WWDC视频:Building Better Apps with Value Types in Swift
关于inheritance - Swift语言中的抽象类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55581608/