/ Objective-C中的类目(Category)的使用.1.类目,2.扩展,3.协议
//为什么使用类目,通过继承来实现某项功能话,有点大材小用的感觉,因为我们有时候只需要实现一个方法,所以继承就大了,没必要,而且NSString是不允许继承的
//创建类目文件是在cocoa的object-c category项目下创建
//1.类目
//1.1为没有源码的类型扩展功能(一般读系统提供的类,因为我们看不到该类的.m文件)
//1.2扩展的功能将会成为原类的一部分
//1.3通过类目可以给原始类添加功能(方法)但是不能给原始类添加实例变量
//1.4类目可以覆盖方法,但是不会再执行之前的那个方法了,而是调用新的方法
//为什么使用类目,通过继承来实现某项功能话,有点大材小用的感觉,因为我们有时候只需要实现一个方法,所以继承就大了,没必要,而且NSString是不允许继承的
//创建类目文件是在cocoa的object-c category项目下创建
//1.类目
//1.1为没有源码的类型扩展功能(一般读系统提供的类,因为我们看不到该类的.m文件)
//1.2扩展的功能将会成为原类的一部分
//1.3通过类目可以给原始类添加功能(方法)但是不能给原始类添加实例变量
//1.4类目可以覆盖方法,但是不会再执行之前的那个方法了,而是调用新的方法
//
// main.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "NSString+SayHi.h"
#import "NSDate+ChangeType.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
#pragma mark----Category类目的使用
NSString *str1 = @"刘亦菲";
NSString *str2 = @"张飞";
[str1 HelloGG];//self调用自身:str1
[str2 HelloMM];
// [NSString test];//类方法
//作业1:使⽤用Category为NSDate类添加⼀一个类⽅方法(dateWithDateString:),实现将下述字符串转换为NSDate对象。 将@“20140402142850”转换为NSDate。
NSDate *result= [NSDate dateWithDateString:@"2013-12-10 10:30:00"];
NSLog(@"%@",result);
#pragma mark----Eetension类的扩展
//Extension针对的是⾃己的类,必须有源代码的类
//1.延展可以添加实例变量,但是类目不可以
Person *person = [[Person alloc]init];
[person work];
int result1 = [person factorial:2];//外界我们只需要传入参数2就行了,不需要知道怎么实现的
NSLog(@"%d",result1);
}
return 0;
}
//
// NSString+SayHi.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (SayHi)
-(void)HelloMM;
-(void)HelloGG;
+(void)test;
@end
//
// NSString+SayHi.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import "NSString+SayHi.h"
@implementation NSString (SayHi)
-(void)HelloMM{
NSLog(@"哈喽,刘亦菲,我是%@",self);
}
-(void)HelloGG{
NSLog(@"哈喽,童星%@",self);
}
+(void)test{
NSLog(@"%@",self);
}
@end
<pre name="code" class="html"><br/>
//
// Person.m
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import "Person.h"
@interface Person (private)//private省去也是没有关系
//以下为私有方法,只能在类的内部(当前的Person类)访问,外界是访问不到的,
-(void)_showInfo;
-(int)squre:(int)count;//求平方
-(int)factorial:(int)number;//求阶乘
@end
//类的延展的语法形式如上,就相当于C中函数的声明
@implementation Person{
int _number;
//在这里定义属性,这个属性也是私有的
//但是这种方式和之前定义的@private的区别
//两者的区别就是一个在.h文件中定义的,一个是.m文件中定义的
//如果是开源的话,一般是开放.h和.m文件
//如果是闭源的话,一般只开放.h文件
}
//私有方法,只是在.m文件中定义了,没有在.h文件中声明,一般是在本类中自己使用的
-(int)squre:(int)count{
return count*count;
}//求平方
-(int)factorial:(int)number{//该方法是需要声明的,它相当于一个借口,供外界传入参数进行使用
int result = 1;
int value = [self squre:number];//本类自己调用私有方法先求平方
//计算平方之后的阶乘
for (int i=1; i<=value; i++) {
result = result*i;
}
return result;
}//求阶乘
-(void)work{
[self _showInfo];
NSLog(@"开始工作了");
}
-(void)_showInfo{
NSLog(@"我的信息");
}
@end
//
// Person.h
// Copyright (c) 2015年 tongxing. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject{
NSString *_name;
int _age;
}
-(void)work;
-(int)factorial:(int)number;
@end