Swift 中的 'open' 关键字是什么?
在 Swift 中,我们有三个关键字——`open`、`public` 和 `final`。这三个词具有不同的属性,有助于我们理解代码是否可以扩展到另一个模块,从而使代码易于重用。本文将学习这些关键字的属性。
示例
这是一个在类定义中使用 `open` 关键字的示例
import Foundation
open class Person {
var firstName: String?
var lastName: String?
var age: Int?
var address: String?
}
class Student: Person {
var school: String?
var grade: Int?
var score: Double?
}
在这个例子中,`Person` 被定义为 `open`,这意味着它可以被子类化。`Student` 是 `Person` 类的子类,能够继承其属性和方法。
如果我们将 `open` 关键字改为 `final`
import Foundation
final class Person {
var firstName: String?
var lastName: String?
var age: Int?
var address: String?
}
class Student: Person {
var school: String?
var grade: Int?
var score: Double?
}
`Person` 现在被定义为 `final`,这意味着它不能被子类化。这将在 `Student` 中导致编译时错误。
值得注意的是,Swift 中类的默认行为是 `final`,因此如果您希望一个类能够被子类化,则必须显式使用 `open` 关键字。
您也可以将 `open` 关键字与结构体和协议一起使用,并且会得到与类相同的行为。
了解 `open` 和 `final` 之间的区别以及 `open` 和 `public` 之间的区别非常重要。
`open` 和 `final` 之间的区别是什么?
`open` 访问权限可用于类、结构体或协议。当您使用 `open` 时,它表示您可以通过同一模块中的其他类、结构体或协议,或其他模块来创建子类或扩展。它有助于使您的代码更灵活和可重用。此概念有助于实现面向对象编程的概念。
另一方面,`final` 关键字表示类、结构体或协议不能被扩展或子类化。当您想要保护您的代码并且不想提供代码重用的灵活性时,`final` 关键字是一个不错的选择。这意味着如果一个类是 `final` 的,则您不能创建它的子类。
以下是这两个关键字差异的总结:
Swift 中的 `open` 与 `final`
| 关键字 | 访问权限 | 可重写性 |
|---|---|---|
| open | 可访问的 | 可重写的 |
| final | 可访问的 | 不可重写的 |
`final` 关键字确保类、结构体或协议不会被子类或扩展更改。基本上,这有助于改进代码优化。此外,编译器不需要处理类、结构体或协议的可扩展性,因为它们是最终的。最后,它提高了应用程序的整体性能。
简而言之,`open` 允许扩展和子类化,而 `final` 则阻止它。
`open` 和 `public` 之间的区别是什么?
`open` 访问权限可用于类、结构体或协议。当您使用 `open` 时,它表示您可以通过同一模块中的其他类、结构体或协议,或其他模块来创建子类或扩展。您的代码变得更灵活,可以重用。
`public` 关键字的属性是指示同一模块或其他模块(导入同一模块)中的其他代码可以访问或使用类、结构体甚至协议。
以下是这两个关键字差异的总结:
Swift 中的 `open` 与 `public`
| 关键字 | 访问权限 | 可重写性 | 子类化 |
|---|---|---|---|
| open | 可在任何模块中访问 | 可重写的 | 允许 |
| public | 可在任何模块中访问 | 不可重写的 | 不允许 |
结论
在本文中,我们发现我们可以将所有三个访问权限用于不同的目的,如下所示:
`open` 关键字 - 它可以被任何模块访问,它是可重写的,并且允许子类化。
`public` 关键字 - 任何模块都可以访问它,但它不可重写,并且根本不允许子类化。
`final` 关键字 - 它不能被扩展甚至子类化。
如果您想完全保护您的代码,则应选择 `final` 关键字。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP