有没有一种方法可以在 Swift 语言中创建一个抽象类,或者这是像 Objective-C 一样的限制?我想创建一个类似于 Java 定义的抽象类的抽象类。
最佳答案
Swift 中没有抽象类(就像 Objective-C 一样)。你最好的选择是使用 Protocol ,这就像一个 Java 接口(interface)。
在 Swift 2.0 中,您可以使用协议(protocol)扩展添加方法实现和计算属性实现。您唯一的限制是您不能提供成员变量或常量并且没有动态调度。
这种技术的一个例子是:
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
请注意,这甚至为结构提供了类似于“抽象类”的功能,但类也可以实现相同的协议(protocol)。
另请注意,每个实现 Employee 协议(protocol)的类或结构都必须再次声明 annualSalary 属性。
最重要的是,请注意没有动态调度。当在存储为 SoftwareEngineer
的实例上调用 logSalary
时,它会调用该方法的覆盖版本。当 logSalary
在被转换为 Employee
后在实例上调用时,它会调用原始实现(它不会动态分派(dispatch)到覆盖版本,即使instance 实际上是一个软件工程师
。
有关详细信息,请查看有关该功能的精彩 WWDC 视频:Building Better Apps with Value Types in Swift
关于inheritance - Swift 语言中的抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55581608/