分类可以覆写该类方法,但是方法很拙劣;因为覆写后再不能访问原来方法,若需要覆写方法,正确的选择可能是创建子类。
记住,通过使用分类添加新方法扩展类不仅影响这个类,同时会影响它的所有子类。
如果子类重写该方法,子类对象将不会使用分类的方法,而是调用自己重写的方法。
创建一个未命名的分类,且在()之间不指定名字,这种特殊的语法定义为类的扩展。定义这样的分类时,可以通过定义附加的实例变量来扩展类,这在命名的分类时不允许的。
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void) Action;
@end
@interface Animal ()
@property BOOL select;
-(void) run;
@end
#import "Animal.h"
@implementation Animal
-(id) init
{
if(self = [super init])
{
_select = YES;
}
return self;
}
-(void) run
{
if(YES == _select)
{
NSLog(@"run");
}
else
NSLog(@"stop");
}
-(void) Action
{
[self run];
}
@end
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Dog : Animal
@end
@implementation Dog
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Dog *d = [[Dog alloc] init];
d.select = NO;
[d Action];
}
return 0;
}
未命名分类中声明的方法需要在主实现区域实现,而不是在分类的实现区域中实现。