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

时间:2017-09-05 07:57:10

标签: swift

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

final class A {

}

class B {    

}

7 个答案:

答案 0 :(得分:52)

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

  

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

     

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

     

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

答案 1 :(得分:42)

无法覆盖标有final的类。

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

有两件事需要考虑:

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

答案 2 :(得分:19)

  

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

了解更多:

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

答案 3 :(得分:10)

最后意味着没有人可以从这个类继承。

答案 4 :(得分:6)

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

答案 5 :(得分:6)

其他答案已经对final关键字有足够的理解。我想举例说明。

请考虑以下示例,其中不包含关键字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)
    }
}

在上面的代码中,它允许覆盖其超类的变量。而带有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)
    }
}
  

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

答案 6 :(得分:1)

希望我可以将其他答案归结为这个对我有帮助的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

在您的项目/模块中:

class SubOpen:     Open {}     // OK
class SubNormal:   Normal {}   // OK
class SubInternal: Internal {} // OK
class SubFinal:    Final {}    // Error: Can't subclass

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

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