Simulating Private and Protected Methods
与大多数面向对象语言不同,Objective-C语言并没有提供方法的作用域。所以,类中的所有方法都是public的。然而,有些时候,类中的某些方法仅仅是帮助自己的类处理一些事情,它们不想也没必要被外面的代码调用。除了在这样的方法上做很多注释(”不要使用”)外,有没有一种方法可以使这些方法只对本类可见或者只是本类和子类可见呢?
答案是使用类别!
方法一:仅在类的实现文件中定义和实现类别,代码如下:
这是Point.m文件
#import "Point.h"
@interface Point (Private)
-(BOOL) isPositiveQuadrant;
@end
@implementation Point
// public method implementations ...
@end
@implementation Point (Private)
-(BOOL) isPositiveQuadrant
{
return (x > 0) && (y > 0) ? YES : NO;
}
@end
在Point.m
文件中,声明了Private类别,并实现了Private类别,但是类别的代码并没有出现在Point.h
文件中,从程序开发的角度上说,外部的代码只能通过Point.h
文件来了解Point类的细节,这么做的话就相当于隐藏了Private类别中的-(BOOL) isPositiveQuadrant方法。当然,如果你知道Point类的对象可以响应-(BOOL) isPositiveQuadrant方法的话,你还是可以在类外面的代码来调用这个方法,不过,你的编译器会给你发出一个警告,因为它在Point.h
文件中,并没有找到-(BOOL) isPositiveQuadrant这个方法,但没有关系,还是会成功编译的。
Point *p = [[Point alloc] init];
BOOL b = [p isPositiveQuadrant];//可以成功编译,不过会警告
用类似的方法也可以模拟出Protected的方法,你可以在一个单独的.h
文件中定义Protected类别,例如PointProtected.h
,然后将protected的方法都放在这个类别中,然后只有子类可以将PointProtected.h
文件#import
进来,这样就模拟实现了Protected的方法。
Using Convention(约定)
还有一种实现Private和Protected的方式,就是所有程序员制定出一个约定,大家共同遵守这个约定,比如在所有Private方法名前面都用_
开头等等,总之是程序员间共同遵守的约定。
{$ activeFileHint $}