协议定义了一系列方法,遵从此协议等对象应该实现它们(如果这些方法不是可选的,那么就必须实现)。于是,我们可以用协议把自己所写的API之中的实现细节隐藏起来,将返回的对象设计为遵从协议的 纯id 类型。这样的话,想要隐藏的类名就不会出现在API之中了。此概念经常称为“匿名对象”。
若是接口背后有多个不同的实现类,而你又不想指明具体使用哪个类,那么可以考虑用这个办法-------因为有时候这些类可能会变,有时候它们又无法容纳于标准的类继承类中,因而不能以某个公共基类来统一表示。
NSFetchedResultsController *controller = /* some controller */;
NSUInteger section = /* section index to query */;
NSArray *sections = controller.sections;
id <NSFetchedResultsSectionInfo> sectionInfo = sections[section];
NSUInteger numberOfObjects = sectionInfo.numberOfObjects;
sectionInfo是个匿名对象。设计此种API时,要把"通过对象能够访问数据分区信息"这一功能于接口中清晰地表达出来。在幕后,此对象可能是由处理结果的控制器所创建的内部状态对象(internal state object)。没必要把表示此种数据的类对外公布,因为使用控制器的人绝对不用关心查询结果中的数据分区是如何保存的,他们只需要知道可以用这些对象上查询数据就行了。我们可以把section数组中返回的内部状态对象视为遵从NSFetchedResultsSectionInfo协议的匿名对象。使用者只要明白这种对象实现了某些特定的方法即可,其余实现细节都隐藏起来了。
要点
-
协议可在某种程度上提供匿名类型。具体的对象类型可以淡化成遵从某协议的id类型,协议里规定了对象所应实现的方法。
-
使用匿名对象类隐藏类型名称。
-
如果具体类型不重要,重要的是对象能够响应(定义在协议里的)特点方法,那么可以使用匿名对象来表示。
网友评论