随着Swift 3中open
关键字的引入,以下是方法的有效范围修饰符:open static
,public static
,open class
,{{1}但他们的差异到底是什么?我理解public class
相当于Java中的public
,允许覆盖public final
类方法和变量,但是open
或{{1} } 意思?它们是public class func
的同义词吗?即所有3个实现都不允许子类覆盖?在特定情况下,4种不同排列中的每一种都有独特的优势吗?
答案 0 :(得分:24)
这个问题不必要地复杂,因为您要比较两个变量(open
与public
和static
与class
)的笛卡尔积的成员,而不是分别询问这两个变量。
这不是open static
vs public static
vs open class
vs public class
的问题,而是open
vs public
和static
vs class
。它们是两个正交的维度。
open
vs public
public
在模块中,public
访问说明符允许访问和覆盖。
从模块外部,public
访问说明符允许访问,但不允许覆盖/子类。
open
在模块中,open
访问说明符允许访问和覆盖。
从模块外部,open
访问说明符允许访问,和允许覆盖/子类。
static
vs class
static
static
成员(方法或属性)是绑定到其定义的特定范围(class
/ struct
/ enum
)的成员。它&# 39;这样命名是因为对这些成员的访问总是静态调度。这相当于Java的static
。目标C与此无关。
class
class
成员是绑定到类或其子类的成员。 class
个成员可以被子类覆盖。因此,在一般情况下,它们会动态调度,但在某些情况下,优化程序可以对class
成员的访问进行虚拟化。 Java与此无关。这相当于Objective C的类(+
)方法。