类别
使用类别可以扩展类的功能,不管该类的源码是否存在都可以扩展,和继承的最大不同就是类别中的方法可以访问被扩展类的私有元素。
- 类别的命名通常使用"类+类别名"的形式,如 Person+PersonLife.h
- 类可以有多个类别。
- 类别会覆盖方法,如果类的方法和类别的方法冲突,则会调用类别的方法
- 类别可以访问私有元素,继承并不可以。
- 类别不能定义属性
类别的定义如下
#import "Person.h"
@interface Person(PersonLife)
@end
@implementation Person(PersonLife)
@end
使用类别
使用的时候导入 #import "Person+PersonLife"
#import "Person+PersonLife.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
}
return 0;
}
类扩展
类扩展是一种特殊的类别,在声明的时候Person() ,括号里不要写名字。
- 扩展可以定义属性。
- 扩展必须和类定义和类实现同时编译,它不能对无源码的类扩展
- 通常使用扩展来声明私有方法
Person 类
#import <Foundation/Foundation.h>
// Person 类
@interface Person : NSObject
// Person 类公开的方法
-(void) print ;
@end
Person 类扩展,扩展中声明私有元素
// 引入原类
#import "Person.h"
// 扩展,扩展中定义私有元素
@interface Person ()
// 私有属性
@property NSString *name ;
// 私有方法
-(void) privateMethod ;
@end
Person 类的实现文件
#import "PersonPrivate.h"
@implementation Person
// 生成私有getter、setter 方法
@synthesize name ;
// 实现公开方法
-(void) print{
[self privateMethod];
}
// 实现私有方法
-(void) privateMethod{
NSLog(@"private Method Execute ~~") ;
}
@end
使用Person 类
// 引入Person 类
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
// 调用类公开的方法
[p print] ;
// p.name ; 报错
// [p privateMethod] ; 报错,name的getter、setter方法和privateMethod都是私有元素,外部无法调用
}
return 0;
}
类别和扩展
时间: 2024-10-10 09:25:29