objective-c 复合

objective-c 复合,第1张

概述编程中的复合就像音乐中的作曲一样:将多个组件组合在一起配合使用 从而得到完美的作品(程序中的复合其实就是类中包含类) 来了:在软件开发过程中,程序员可能会使用一个Pedal(脚踏板/脚蹬子) 对象和一个Tire(车轮)对象组合出虚拟的独轮车。 @interface Unicycle:NSObject {    Pedal *pedal;    Tire *tire; } @end //Unicyc
编程中的复合就像音乐中的作曲一样:将多个组件组合在一起配合使用
从而得到完美的作品(程序中的复合其实就是类中包含类)
来了:在软件开发过程中,程序员可能会使用一个Pedal(脚踏板/脚蹬子)
对象和一个Tire(车轮)对象组合出虚拟的独轮车。
@interface Unicycle:NSObject
{
   Pedal *pedal;
   Tire *tire;
}
@end //Unicycle
Pedal和Tire通过复合的方式组成了Unicycle独轮车。
来个新的程序吧:
car程序

来看看如何搭建一个汽车模型:
包括一个发动机和4个轮胎
使用两个只包含一个方法的类来输出他们各自所代表的含义:
轮胎对象会说:我们是轮胎
发动机对象会说:我是发动机
当然在真正的程序中,轮胎会有气压和 *** 控能力等属性。
发动机也会有马力和油耗等属性。
来看一下程序:
首先导入 Foundation框架的头文件
#import <Foundation/Foundation.h>
然后是我们的 Tire 类,类里面只有一个 descriotion 方法。

@interface Tire:NSObjet
@end // Tire
@implementation Tire
-(Nsstring *) description
{
   return (@"I am a tire,I last a while");
}//description
@end //Tire
说明:如果类中不包含任何实例变量,就可以省去上面代码中的花括号。

其实,Tire类中只有一个方法:description 并且没有在接口中声明,
从哪里来的呢?

自定义NSLog
记住:通过NSLog()可以使用%@格式说明符来输出对象,NSLog()处理%@
说明符的时候,会询问参数列表中相应的对象,以得到这个对象的描述
从技术上,就是NSLog给这个对象发送描述消息,然后对象的description
生成一个Nsstring并返回。之后NSLog()在其输出中包含这个字符串。
一句话:
在类中添加description方法就可以自定义NSLog如何输出对象。

当然,在自定义的NSLog中,可以返回一个字面值 Nsstring 例如
@"I am a cheese Danish Object"(丹麦乳酪蛋糕,其实我不是很喜欢)
也可以构造一个描述该对象所有此信息的字符串,比如:这个蛋糕的
脂肪含量和卡路里。
在Cocoa中,NSArray类管理的是对象的集合,它的description方法
提供数组自身的信息,例如:数组中对象的个数和每一个对象所包含的
描述,当然,对象的描述是向数组中的对象发别发送description消息得

来的、

其实复合和继承的区别就是  继承是你是我  复合是你有我

让我们回到我们的car程序: 看看 Engine(发动机) 类,与Tire一样,Engine也包含了一个 description方法,在真实的程序中,Engine类会包含start(启动) accelerate(加速)等方法和RPM(转数)等实例变量。 @interface Engine:NSObject @end //Engine @implementation Engine -(Nsstring *) description {    return (@"I am a engine,Vrooom!") } @end //Engine 程序的最后是Car(闪耀登场) 它拥有一个Engine对象和一个由4个tires对象组成的C数组,通过 复合的方式来组装自己。还有一个print方法,这个方法使用NSLog() 来输出轮胎和发动机的描述: @interface Car:NSObject {    Engine *engine;    Tire *tires[4]; } -(voID) print; @end // car 每一个car对象都会为指向 engine和tires的指针分配内存 当然,真正包含在car里面的并不是Engine和Tire变量,而只是内存中 其他对象的引用。为新建的car分配内存的时候,这些指针将被初始化 为nil(零值)。 我们来瞧瞧car类的实现: @implementation Car -(ID) init {    if(self=[super init])    {       engine = [Engine new];       tires[0] = [TrIE new];       tires[1] = [Tire new];       tires[2] = [Tire new];       tires[3] = [Tire new];    }    return self; }//init -(voID) print {    NSLog(@"%@",engine);    NSLog(@"%@",tires[0]);    NSLog(@"%@",tires[1]);    NSLog(@"%@",tires[2]);    NSLog(@"%@",tires[3]); }//print @end // car 注意:关于if语句: 有一个if语句看起来是相当的奇怪:   if(self=[super init])   如果父类(NSObject)可以完成所需要的一次性初始化   就调用[super init] init方法的返回值(ID,泛型对象指针)   描述了被初始化的对象。 将[super init]结果赋值给self是Objective-C的标准惯例 防止超类在初始化的过程中返回的对象不同于原来创建的对象 (点头微笑吧) 最后一部分:main int main(int argc,const char *argv[]) {    Car *car;    car = [Car new];    [car print];    return (0); }//main 好  现在可以运行了

总结

以上是内存溢出为你收集整理的objective-c 复合全部内容,希望文章能够帮你解决objective-c 复合所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1062606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存