------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
1.类的复合
首先先上代码演示一下:
Dog.h
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (assign, nonatomic)int age;
@property (copy, nonatomic)NSString *name;
@property (copy, nonatomic)NSString *color;
- (void)run;
@end</span>
Dog.m
#import "Dog.h"
@implementation Dog
- (void)run{
NSLog(@"Dog running.........");
}
@end
Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"//包含dog类声明的头文件
@interface Person : NSObject
@property (assign, nonatomic)int age;
@property (copy, nonatomic)NSString *name;
@property (assign, nonatomic)float height;
@property (retain, nonatomic)Dog *dog;//Person类中包含了一个Dog类的对象
- (void)run;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)run{
NSLog(@"Person running.........");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Dog *xiaobai = [[Dog alloc] init];//实例化一个xiaobai对象
//点语法调用setter方法
xiaobai.age = 1;
xiaobai.name = @"xiao bai";
xiaobai.color = @"white";
Person *xiaoxin = [[Person alloc] init];//实例化一个person类的对象
xiaoxin.age = 5;
xiaoxin.name = @"也原新之助";
xiaoxin.height = 110.0;
xiaoxin.dog = xiaobai;//xiaoxin养了一只xiaobai
//打印xiaoxin的相关信息
NSLog(@"person age is %d name is %@ height is %f", xiaoxin.age, xiaoxin.name, xiaoxin.height);//点语法调用getter方法
//打印xiaoxin养的xiaobai的相关信息
NSLog(@"person have a dog age is %d name is %@ color is %@", xiaoxin.dog.age, xiaoxin.dog.name, xiaoxin.dog.color);
//xiaoxin跑了起来,xiaobai也跟着跑起来
[xiaoxin run];
[xiaoxin.dog run];
}
return 0;
}
看到这,你也许就明白了一大半,所谓类的复合,就是在另一个类中,用这个类声明一个变量,接收此类对象。
附:
@class和#import的区别
当用类的包含时就要用@class
@class:类的前置声明,只是相当于高度系统class后面是一个类,至于类中的细节(实例变量,方法)系统不知道
#import:类的声明头文件包含,不仅告诉系统""<>里面是一个类,并且连同类中的细节(实例变量和方法)一同告诉系统
分类就是在不改变本有的类的基础上给这个类增加新的方法,在以后上线的程序更新中可以使用,它和类的区别是,它不可以增加实例变量,下面上代码:
student.h
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (assign,nonatomic)int age;
@property (copy,nonatomic)NSString *name;
@end
student.m
<span style="font-size:18px;">@implementation Student
@synthesize age=_age;
@synthesize name=_name;
@end</span>
这个类中我没有给它任何方法
接下来上category类
CategoryToStudent.h
<span style="background-color: rgb(255, 255, 255);">#import "Student.h"
@interface Student (CategoryToStudent)
- (void)descStudent;
@end</span>
CategoryToStudent.m
<span style="background-color: rgb(255, 255, 255); ">#import "Student+CategoryToStudent.h"
@implementation Student (CategoryToStudent)
- (void)descStudent{
NSLog(@"name is %@,age is %i",self.name,self.age);
}
@end</span>
这样我就给student的这个类增加了打印姓名和年龄的方法
你也可以尝试着给系统类增加一些方法,例如,NSArry:
CategoryToArray.h
@interface NSArray (CategoryToArray)
- (void)descArray;
@end
CategoryToArray.m
#import "NSArray+CategoryToArray.h"
@implementation NSArray (CategoryToArray)
- (void)descArray{
for (id i in self) {
NSLog(@"%@",i);
}
}
@end
main中就可以通过下面这样打印数组成员了
NSArray *array=[[NSArray alloc]initWithObjects:@"i",@"am",@"a",@"shuai",@"man",nil];
[array descArray];
总结:开始的时候我也很纠结,为什么要写这么多的类,岂不是更麻烦,明明主函数中几行就搞定了呀!但是后来我在做一个象棋的小程序时,不由自主的就想到了把一些方法重写,把一些功能封装成类,类不仅使代码变的简洁,而且还是我们的工作变的方便!