在之前的项目中,我们编程都是直接写在一个main.m文件中。类的main()函数,@interface和@implementation部分都塞进一个文件。这种结构对于小程序和简便应用来说还可以。但是项目文件一多,规模一上去。这样就很不好,既不美观,代码也不好管理。

  那么,接下来这篇博文,我们就接着上一节的例子。将他定义和实现的代码分开,每个对象一个类。在Objective-c中,定义的文件写在h文件中,实现的代码写在m文件中。于是,我们先新建一个Command Tools项目。

选择项目文件要保存的地方

然后在新建的项目中依次新建三个类对象Car,Engine,Tire。每个类建好,都会生成两个文件(.h:写定义方法,.m:写实现方法)。

然后在Engine.m中写实现方法:

 #import "Engine.h"

 @implementation Engine
-(NSString *)description
{
return (@"I am an engine. Vrooom!");
}
@end

Tire.m中写实现方法:

 #import "Tire.h"

 @implementation Tire
-(NSString *) description
{
return (@"I am a tire. I last a while");
}
@end

接下来修改Car.h文件,写Car类的定义方法:

 #import <Foundation/Foundation.h>
#import "Engine.h"
#import "Tire.h" @interface Car : NSObject
{
Engine *engine;
Tire *tires[]; //四个轮子,定义一个四个数的数组。
}
-(Engine *) engine;
-(void) setEngine:(Engine *) newEngine;
-(Tire *) tireAtIndex:(int) index;
-(void) setTire:(Tire *) tire atIndex:(int) index;
-(void) drive;
@end // Car

注意:要先在最上面引用“Engine.h”和“Tire.h”。否则,代码就不能编译通过。

然后是修改Car类的实现方法:

 #import "Car.h"

 @implementation Car
-(void) setEngine:(Engine *) newEngine
{
engine = newEngine;
} -(Engine *) engine
{
return (engine);
} -(void) setTire:(Tire *) tire
atIndex:(int) index
{
if(index< || index>)
{
NSLog(@"bad index(%d) in setTire:atIndex",
index);
exit();
}
tires[index] = tire;
} -(Tire *) tireAtIndex:(int) index
{
if(index< || index>)
{
NSLog(@"bad index(%d)in tireAtIndex:",
index);
exit();
}
return (tires[index]);
} -(void) drive{
NSLog(@"%@",engine);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
NSLog(@"%@",tires[]);
}
@end

最后,只要在main主函数的文件中,引用三个类文件的定义文件就可以了,实现的代码不用变:

 #import <Foundation/Foundation.h>
#import "Engine.h"
#import "Tire.h"
#import "Car.h" int main(int argc, const char * argv[])
{
Car *car = [Car new];
Engine *engine = [Engine new];
[car setEngine:engine];
for(int i=;i<;i++)
{
Tire *tire = [Tire new];
[car setTire:tire atIndex:i];
} [car drive];
return ;
}

项目文件的基本结构,以及运行的结果如图:

  由于本篇博文只是简单的将代码结构重新的整理了下,至于功能代码则和上一篇中介绍的完全相同,这边就不再细说了。如果朋友们感兴趣或者有看不懂的,可以查看上一篇博文,或者给我留言。好了,时间不早了,洗洗早点睡吧。

《objective-c基础教程》学习笔记(八)—— 拆分接口和实现的更多相关文章

  1. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...

  2. 【学习笔记】Python基础教程学习笔记

    教程视频网盘共享:http://pan.baidu.com/s/1hrTrR5E 03-python基础.if判断 print 输出数据 print("hahahah")----- ...

  3. 匿名内部类--毕向东java基础教程学习笔记

    1.匿名内部类其实就是内部类的简写形式. 2.定义匿名内部类的前提: 该内部类必须继承一个类,或者实现一个接口. 3.匿名内部类的格式:new 父类名或接口名(){定义子类内容:} 4.其实匿名内部类 ...

  4. 内部类--毕向东Java基础教程学习笔记

    内部类的访问规则 1. 内部类可以直接访问外部类的成员,包括私有. 之所以可以直接访问外部类的成员,是因为内部类中持有外部类的引用,格式:外部类名.this 2.外部类要访问内部类,必须建立内部类对象 ...

  5. 异常处理——毕向东Java基础教程学习笔记

    1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象.                        其实 ...

  6. 《嵌入式Linux基础教程学习笔记一》

    常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...

  7. Objective-C基础教程学习笔记(附录)从Java转向Objective-C

    Java接口与Objective- C正式协议类似,因为它们都需要实现一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但在Objective-C中, 可以使用文件范围内 ...

  8. Python基础教程学习笔记:第二章 列表和元组

    1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串 ...

  9. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  10. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

随机推荐

  1. 2.1 View的绘制

    view绘制流程是从ViewRoot的performTraversals()方法中开始的,在该方法中会执行view绘制的三部曲,即:measure(测量视图的大小),layout(确定视图的位置)dr ...

  2. java基础-反射之Class.forName

    Class.forName 查阅javaAPI public static Class<?> forName(String className) throws ClassNotFoundE ...

  3. 网站实时协作JavaScript库 TogetherJS

    TogetherJS是由Mozilla打造的一款可以给网站添加实时协作功能的JavaScript库,TogetherJS免费并且开源,遵循MPL 2.0开源协议,并且托管在Mozilla服务器上. 为 ...

  4. ftp客户端命令使用简记

    OS:windows8.1评估版 程序和功能 tftp客户端勾选上 Win+R:运行,键入cmd,键入ftp -help 如下图: 使用ftp客户端可以做的事:将文件传送到运行FTP服务器服务(经常称 ...

  5. C#设计模式——工厂方法

    一.为什么需要工厂方法      工厂方法可以这么理解.你规定了一个规范,只要符合这个规范.那么就可以按照你的方式进行操作,这样你就无需知道具体操作的对象是什么,具有什么特性等等,可以进行统一化的操作 ...

  6. ARCGIS FOR JAVASCRIPT API 出现multipleDefine问题

    问题: Error {src: "dojoLoader", info: Object, stack: (...), message: "multipleDefine&qu ...

  7. 设计模式之美:Prototype(原型)

    索引 别名 意图 结构 参与者 适用性 缺点 效果 相关模式 命名约定 实现 实现方式(一):使用一个原型管理器. 实现方式(二):使用浅拷贝实现克隆(Clone)操作. 实现方式(三):使用深拷贝实 ...

  8. Spring - 初始化spring容器

    2016.01.12 学习linux内核的过程中发现变相的提升了自己的工程能力.以前觉得spring这些东西很复杂麻烦.然而,学了linux内核再看这些东西,发现好简单. 学习spring首先就要学习 ...

  9. 改写libsvmread读取多标记数据集

    在libsvm和liblinear软件包里有一个C函数叫libsvmread,这个函数的作用是把如下格式的文本文件\begin{align*} 1 & \ \ *:* \ \ *:* \\ - ...

  10. atitit.客户端连接oracle数据库的方式总结

    客户端连接oracle数据库的方式总结 目录 Java程序连接一般使用jar驱动连接..... 桌面GUI一般采取c语言驱动oci.dll 直接连接... 间接连接(需要配置tns及其envi var ...