最终班级和班级有什么区别?

Moh*_*our 40 swift

最终班级和班级有什么区别?

final class A {

}

class B {    

}
Run Code Online (Sandbox Code Playgroud)

luc*_*hra 63

Final是类修饰符,可以防止它被继承或被覆盖.来自苹果文档

您可以通过将方法,属性或下标标记为final来阻止它被覆盖.通过在方法,属性或下标的介绍者关键字(例如final var,final func,final class func和final subscript)之前编写final修饰符来完成此操作.

任何覆盖子类中的最终方法,属性或下标的尝试都会报告为编译时错误.您添加到扩展中的类的方法,属性或下标也可以在扩展的定义中标记为final.

您可以通过在类定义(最终类)中的class关键字之前编写final修饰符来将整个类标记为final.任何将最终类子类化的尝试都会报告为编译时错误.


tot*_*ter 58

标记为的类final不能被覆盖.


为什么要关心课程是否可以被覆盖?

有两件事需要考虑:

  1. 作为API设计人员/开发人员,您的框架中可能有一个类在子类时可能被滥用或滥用.final防止类被子类化 - 任务完成.您还可以使用final标记非最终类的方法,属性甚至下标.这将产生相同的效果,但对于课程的特定部分.
  2. 标记类final也告诉Swift编译器应该直接调用该方法(静态调度),而不是从方法表(动态调度)中查找函数.这减少了函数调用开销,并为您提供额外的性能.您可以在Swift Developer Blog上阅读更多相关内容.

  • 我想添加另一个(非常重要的)原因何时将final添加到类中:您作为开发人员在设计类时没有考虑继承.要向同事(或班级用户)展示这一点,请添加`final`.如果稍后需要继承,则最终修饰符将提醒您认为重构通过. (5认同)
  • 很好的答案。有趣的是我如何在整个应用程序中检测到性能提升。我在我的项目中声明的所有类都没有使用 `final` 关键字,因为我几乎没有对其中的任何类进行子类化,添加 `final` 关键字确实提高了我的性能。 (4认同)
  • 使用“整体模块优化”时,不需要在* internal *声明上使用“ final”,这是可以推断的(请参见链接的Swift Developer Blog文章)。 (3认同)

Vla*_*bir 20

当您知道不需要覆盖声明时,请使用final.final关键字是对类,方法或属性的限制,表示无法覆盖声明.这允许编译器安全地忽略动态调度间接.

阅读更多:

https://developer.apple.com/swift/blog/?id=27


iam*_*han 12

最终意味着没有人可以从这个类继承.


Sup*_*tar 8

希望我能将其他答案归结为对我有帮助的SSCCE

          open class Open {}     // Anyone can see, anything can subclass
public         class Normal {}   // Anyone can see, internal can subclass
internal       class Internal {} // Internal can see, internal can subclass
public   final class Final {}    // Anyone can see, nothing can subclass
Run Code Online (Sandbox Code Playgroud)

在您的项目/模块中:

class SubOpen:     Open {}     // OK
class SubNormal:   Normal {}   // OK
class SubInternal: Internal {} // OK
class SubFinal:    Final {}    // Error: Can't subclass
Run Code Online (Sandbox Code Playgroud)

在其他一些项目/模块中:

class SubOpen:     Open {}     // OK
class SubNormal:   Normal {}   // Error: Can't subclass
class SubInternal: Internal {} // Error: `Internal` type not found
class SubFinal:    Final {}    // Error: Can't subclass
Run Code Online (Sandbox Code Playgroud)


Wil*_* Hu 7

除了final声明不需要被覆盖也具有比不使用更好的性能final,因为final在运行时禁用动态调度,这节省了运行时开销.


Hit*_*esh 7

其他答案已经对最终关键词有足够的了解.我想通过一些例子来解释.

请考虑以下没有final关键字的示例.

class A {
   public var name: String
   var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}
class B:A{
    override init(name: String, breed: String) {
        super.init(name: name, breed: breed)
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,它允许覆盖它的超类的变量.而带有final关键字的Class不允许它.参考下面的例子.

final class A {
   public var name: String
   var breed: String

    init(name: String, breed: String) {
        self.name = name
        self.breed = breed
    }
}

class B:A{
    **//ERROR:inheritance from a final class 'A' class B**
    override init(name: String, breed: String) {
        super.init(name: name, breed: breed)
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将给出最终A类B类的错误继承