inheritance - Swift 语言中的抽象类

标签 inheritance abstract-class subclass swift

有没有一种方法可以在 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/31298462/

相关文章:

C++: protected 类构造函数

.net - 从WPF页面继承

c# - 获取通用抽象类的属性名

c++ - 在自身内部定义类的标准实例 (C++)

java - 如何用相似但不同的对象填充列表?

C++中抽象类的函数定义

java - Java中抽象类的目的是什么?

java - 使用子类化替换未实现接口(interface)的 Java 类

java - 覆盖子类中的成员数据,在父类(super class)实现中使用?

java - 如何对车辆进行分类——继承与接口(interface)