对访问控制与protected的理解

发布于:2014-08-20 16:11阅读数:

当Swift提供了访问控制特性后,大家对该特性的响应非常积极和强烈。同时也有很多开发者朋友会问为什么Swift中没有提供类似 protected 访问级别呢? 然而很多其他编程语言都有访问控制选项,就

本文由CocoaChina翻译组成员 DevTalking (博客 )翻译自苹果官方博客 Access Control and protected 

 

当Swift提供了访问控制特性后,大家对该特性的响应非常积极和强烈。同时也有很多开发者朋友会问“为什么Swift中没有提供类似 protected 访问级别呢?” 然而很多其他编程语言都有访问控制选项,就是只能由子类可以访问某些方法的访问级别。

 

当定义 Swift 的访问级别时,我们主要考虑了以下两个使用情况:
对app的其他部分隐藏类的私有细节信息
对客户端应用程序隐藏框架的内部细节
 
这两种情况就分别对应了 private 和 internal 访问级别。
 
相比之下,protected 保护了继承者的访问权限,这个新的访问控制级别给我们带来全新的思考方式和设计模式。但实际上,该级别并没有提供真正意义上的保护,因为子类总是能通过 public 级别的方法和属性去暴露protected的API。它也没有提供额外的优化解决机制,因为一个父类的方法或属性可以被很多个子类重写,很难控制。所以也没有必要在这方面进行限制,也就是说在现有机制下,子类可以访问父类的一些成员,但是在子类中使用的,或帮助子类实现某些功能的类并不一定能访问到该子类父类的成员。
 
正如一些开发者指出的那样,Apple的框架里有些API被分离出来,专供子类使用。protected在这里会不会有帮助呢?我们查看了相关代码后,发现这些API大体符合这么两点情况。第一,一些方法在子类之外不是真正有用,所以没有必要将其保护为只能由子类使用。第二,一些方法是专门用于重载,但不能被调用。比如 drawRect(_:) 方法,这肯定可以在 UIKit 框架代码库中使用,但是在 UIKit 框架之外就没法调用了。
 
在扩展类的时候,如何与 protected 级别的成员交互也思考的不是很明确。比如一个类的扩展是否可以访问该类的 protected 成员呢?或者一个子类的扩展是否能访问其父类的 protected 成员呢?在相同模块中申明类的扩展会有什么不同呢?
 
还有一个影响我们当前设计的因素:苹果公司内部和外部现有的Objective-C开发者。Objective-C的方法和属性通常都是在(.h)公共头文件中声明的,但同样可以将其添加到实现文件(.m)中的类扩展部分。当公共类的某些部分在框架的其他地方使用,但没有超出框架外时,开发者就需要使用类的“internal” bits创建第二个头文件。这些种情况就对应着Swift中的public、private、internal三种访问级别。
 
Swift提供的访问控制特性本着单一、易于理解、与继承无关的原则。我们认为现在这种模式很简单也很容易理解,并且也会经常用到访问控制,比如隐藏类或框架中一些实现细节。这种访问控制机制可能和你以前使用的其他语言不太一样,但是我们鼓励你们大胆的去尝试。

CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!

请搜索微信号“CocoaChina”关注我们!

搜索CocoaChina微信公众号:CocoaChina

顶部