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/55581608/

相关文章:

c++ - 关于模板继承

带有类型参数的 Java 类

java - Student.Graduate 类型的 arrayList 类型不正确

c++ - 使用 shared_ptr 将 base 抽象为 boost.python 的持有者

非抽象类的 C++ 抽象类分配错误

java - 为什么 java 多态性在我的示例中不起作用

python - 强制唯一与模型继承一起

C# - 在我没有编写的类中使用多态性

Java类继承

c# - 从子类提供抽象类成员变量