objective-c 编程基础(3.3 分类和协议)

来源:互联网 发布:nba历届最佳新秀数据 编辑:程序博客网 时间:2024/06/07 14:47

【分类】

分类,适用于给原有类添加新的方法,不适合修改、增加原有类的变量、不适合重载原有类的方法。

在分类里,可以调用原有类的变量、方法。

如下图所示:

#import "Person.h"//分类一般用于添加新的方法,不适合修改或增加原有的实例变量、重载原有的方法。@interface Person (sport)- (void) sport;- (void) reset;@end
#import "Person+sport.h"@implementation Person (sport)-(void)sport{    NSLog(@"%@去运动了",self.name);    [self print];}-(void) reset{    NSLog(@"%@需要休息",self.name);}@end
分类的使用:
#import <Foundation/Foundation.h>#import "Person.h"#import "Person+sport.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSLog(@"Hello, World!");        Person *person = [[Person alloc] initWithName:@"小明"];        [person sport];        [person reset];    }    return 0;}

【协议】

协议跟java 的接口(抽象类)差不多。

协议的定义格式:

@protocol  协议名  <父协议>

定义方法

@required:这个表示这个方法是其他类必须实现的,也是默认的值

@optional:这个表示这个方法对于其他类实现是可选的

@end


协议的使用,如下图所示:

#import <Foundation/Foundation.h>@protocol Ability<NSObject>@required //必须要实现的方法-(void) breath:(int) ath;-(void) study;@optional //可选实现的方法-(void) work;@end@interface Person : NSObject <Ability>//属性@property(nonatomic,strong,readwrite) NSString *name;//方法-(Person*) initWithName:(NSString*) name;-(void) print;@end
#import "Person.h"@implementation Person-(Person*) initWithName:(NSString*) name{    self = [super init];    if (self) {        [self setName:name];    }    return self;}-(void) print{    NSLog(@"姓名为%@",self.name);}//遵守协议-(void) breath:(int) ath{    NSLog(@"%@呼吸了%i次",self.name,ath);}-(void) study{      NSLog(@"%@正在学习",self.name);}@end
上面的代码中NSObject不是我们之前说的NSObject类了,而是NSObject协议,他也是OC中第一个协议,这个名字相同在OC中是没有关系的。

协议的调用:

#import <Foundation/Foundation.h>#import "Person.h"#import "Person+sport.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        // insert code here...        NSLog(@"Hello, World!");        Person *person = [[Person alloc] initWithName:@"小明"];        //分类方法        [person sport];        [person reset];                //协议方法        [person breath:3];        [person study];    }    return 0;}






原创粉丝点击