知识卡片

static与class关键字的可重写性差异

专业/工作 · 749.a

内容

类型方法(对类型本身调用而非对实例调用,如Square.numberOfSides())在结构体/枚举上必须用static声明;在类上则有两种选择:class声明的类型方法可以被子类用override重写各自的实现,static声明的类型方法等价于final class,禁止任何子类覆盖。这个细节把[[继承是类独有的能力]]里”是否允许被继承覆盖”的选择,从实例方法延伸到了类型方法层面:class关键字保留了多态的余地(不同子类发出不同的”怪兽叫声”),static则明确宣告”这个行为对整个类型家族是统一的、不容许变体”。选哪个关键字本质上是在声明处就把”这个方法未来是否可能因子类不同而不同”的设计意图写死。

参考来源

《Swift编程权威指南》第15章《结构体和类》