object-c 学习(二)

复合
继承是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称为函数签名关键字,在后面的调用的时候会用的到。这样每个参数前面的关键字或多或少指示了参数的意义。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值