复合
继承是is a 的关系,是一个
复合是has a 的关系,有什么
其中注意到在Engine类中并没有description的声明,那么这是怎么回事呢?
从技术上来看,就是NSLog()给这个对象发送描述消息,然后对象的description方法生成一个NSString并返回,之后NSLog在其输出中包含这个字符串即可。我感觉
就是一个默认的功能。
后面的init方法以后才有更细致的介绍。
print中%@是调用对象的description的方法并显示结果。
存取方法是用来读取或者改变对象特定属性的方法,改变对象中的某个属性使用setter方法,而getter方法可以读取对象某一个属性。
尤其注意的是:在对其他对象的属性进行操作的时候,应该始终使用对象所提供的存取方法,永远不要直接改变其他对象属性的数值。
开始Engine和Tire类里面定义了description方法,在Car里面分别设定了关于engine和tire的setter方法和getter方法。
其中的tire的setter方法的方法声明格式是比较新颖的:
- (void) setTire:(Tire*)tire atIndex:(int)index;
setTire和atIndex称为函数签名关键字,在后面的调用的时候会用的到。这样每个参数前面的关键字或多或少指示了参数的意义。
继承是is a 的关系,是一个
复合是has a 的关系,有什么
以代码为例
#include <Foundation/Foundation.h>
@interface Engine :NSObject
@end //Engine
@implementation Engine
- (NSString *) description
{
return (@"I am a Engine ,Vhoom");
}
@end
@interface Tire : NSObject
@end //Tire
@implementation Tire
- (NSString *) description
{
return (@"i am a tire ,thank you ");
}
@end
@interface Car : NSObject
{
Engine *engine;
Tire *tire[4];
}
- (void) print;
@end
@implementation Car
- (id) init
{
if(self = [super init])
{
engine = [Engine new];
tire[0] = [Tire new];
tire[1] = [Tire new];
tire[2] = [Tire new];
tire[3] = [Tire new];
}
return(self);
}
- (void) print
{
NSLog(@"%@",engine);
NSLog(@"%@",tire[0]);
NSLog(@"%@",tire[1]);
NSLog(@"%@",tire[2]);
NSLog(@"%@",tire[3]);
}
@end
int main()
{
id car;
car = [Car new];
[car print];
return 0;
}
先定义的两个类是Engine和Tire,然后由这两个组成了Car。
其中注意到在Engine类中并没有description的声明,那么这是怎么回事呢?
从技术上来看,就是NSLog()给这个对象发送描述消息,然后对象的description方法生成一个NSString并返回,之后NSLog在其输出中包含这个字符串即可。我感觉
就是一个默认的功能。
后面的init方法以后才有更细致的介绍。
print中%@是调用对象的description的方法并显示结果。
存取方法是用来读取或者改变对象特定属性的方法,改变对象中的某个属性使用setter方法,而getter方法可以读取对象某一个属性。
尤其注意的是:在对其他对象的属性进行操作的时候,应该始终使用对象所提供的存取方法,永远不要直接改变其他对象属性的数值。
#import <Foundation/Foundation.h>
//-------------------------------
@interface Tire :NSObject
@end //Tire
@implementation Tire
- (NSString *) description
{
return(@"i am a tire .");
} //description
@end //Tire
//-------------------------------
@interface Engine : NSObject
@end //Engine
@implementation Engine
- (NSString *) description
{
return(@"i am a engine");
}
@end //Engine
//--------------------------------
@interface Car : NSObject
{
Engine *engine;
Tire *tires[4];
}
- (Engine *) engine;
- (void) setEngine:(Engine *) newEngine;
- (Tire *) tireAtIndex:(int) index;
- (void) setTire : (Tire *) tire
atIndex :(int) index;
- (void) print;
@end //Car
@implementation Car
- (Engine *) engine
{
return (engine);
}
- (void) setEngine:(Engine *) newEngine
{
engine = newEngine;
}
- (void) setTire : (Tire *) tire
atIndex:(int) index
{
tires[index] = tire;
}
-(Tire *) tireAtIndex : (int) index
{
return(tires[index]);
}
- (void) print
{
NSLog(@"%@",engine);
NSLog(@"%@",tires[0]);
NSLog(@"%@",tires[1]);
NSLog(@"%@",tires[2]);
NSLog(@"%@",tires[3]);
}
@end //Car
int main()
{
Car *car = [Car new];
Engine *engine =[Engine new];
[car setEngine:engine];
int i;
for (i = 0;i < 4;i++)
{
Tire *tire = [Tire new];
[car setTire:tire atIndex:i];
}
[car print];
return 0;
}
这段代码是去掉init方法后的。
开始Engine和Tire类里面定义了description方法,在Car里面分别设定了关于engine和tire的setter方法和getter方法。
其中的tire的setter方法的方法声明格式是比较新颖的:
- (void) setTire:(Tire*)tire atIndex:(int)index;
setTire和atIndex称为函数签名关键字,在后面的调用的时候会用的到。这样每个参数前面的关键字或多或少指示了参数的意义。