Objective-C教程第三章讲解哪些面向对象编程核心概念?

2026-05-25 13:091阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1813个文字,预计阅读时间需要8分钟。

Objective-C教程第三章讲解哪些面向对象编程核心概念?

目录 + Objective-C + 基础教程第三章,面向对象编程基础知识 + 0x00 + 前言 + 0x01 + 间接引用(indirection) + 0x02 + 面向对象编程中使用间接引用 + 面向过程编程 + 面向对象编程 + 0x03 + OC面向对象 + 技术语法 + 0x04 + OC语言中的OOP + @int

目录
  • Objective-C 基础教程第三章,面向对象编程基础知识
    • 0x00 前言
    • 0x01 间接(indirection)
    • 0x02 面向对象编程中使用间接
      • 面向过程编程
      • 面向对象编程
    • 0x03 OC面向对象 术语
    • 0x04 OC语言中的OOP
      • @interface
      • @implementation
      • instantiation(实例化对象)
    • 0x05 第三章小节

Objective-C 基础教程第三章,面向对象编程基础知识 0x00 前言

书中的这章节主要是对零基础的人介绍面向对象编程的基础知识,一般学过高级编程语言的基本都会涉及到面向对象编程的知识,所以可以略过。

术语:OOP的解释

面向对象编程(Object-Oriented Programming)的首字母缩写为:OOP,这是一种编程技术,最初是为了编写模拟程序开发的。OOP很快就俘虏了其他种类软件(比如涉及图形用户界面的软件)开发者的心。很快OOP就成为了业内一个非常重要的流行词。它被誉为具有魔力的颜色子弹,可以使编程工作变得简单而愉悦。

在讨论OOP之前,先来看看OOP的一个关键概念:间接(indirection)

0x01 间接(indirection)

间接是一种概念,为什么要用间接从书本上的几个例子中,我大概体会到应该就是为了可变性,比如说我在代码里面有个循环语句,然后有个printf每次输出1-xxx的值,那么我要改循环次数的时候就需要每次将printf里面的xxx改成循环的次数,如果用变量来代替的话我只需要改一次循环次数即可。

还有就是用文件间接的方式,比如我要输出一堆数据,都需要提前定义一个列表或者数组,那么需求有变动的时候我就要每次改这些变量里面的值,但是如果我程序从文件里面读取这些数据,我只需要修改下文件里面的内容即可,所以可变动性就特别好。

0x02 面向对象编程中使用间接

在书中看完间接的知识后, 对间接的概念大致有了个了解。在面向对象编程中(OOP),间接可以说是他的核心。

OOP使用间接来获取数据,就像我们在之前的例子中使用变量、文件和参数所做的那样。OOP真正的革命性在于它使用间接来调用代码!不是直接调用某个函数,而是用间接调用!

只要理解了这一点,你就算掌握了OOP的内涵了。其他一切都是通过间接产生的引申效果。

面向过程编程

首先来看两个例子,分别是面向过程编程和面向对象编程的代码,书中说到:过程式编程建立在函数之上,数据为函数服务。

//********************************************************************* //利用纯C语言和过程式编程方式绘制几何体的形状。 // //《Object-C 基础教程》 03.08 Shapes-Procedural //********************************************************************** #import <Foundation/Foundation.h> //----------------------------------------变量声明---------------------------------- //几何体形状类型 typedef enum{ kCircle, //圆圈 kRectangle,//矩形 kEgg, //鸡蛋 }ShapeType; //几何体颜色类型 typedef enum{ kRedColor, //红色 kGreenColor,//绿色 kBlueColor, //蓝色 }ShapeColor; //几何体轮廓结构体 typedef struct{ int x,y,width,height; }ShapeRect; //几何体结构体 typedef struct{ ShapeType type; ShapeColor fillColor; ShapeRect bounds; }Shape; void drawShapes(Shape shapes[],int num) //------------------------------------------------------------------------------- //入口点代码 int main(int argc, const char * argv[]) { @autoreleasepool { Shape shapes[3]; //圆形数据赋值 ShapeRect rect0 = {0,0,10,30}; //x,y坐标与宽和高数据 shapes[0].type = kCircle; //几何体类型 shapes[0].fillColor = kRedColor;//几何体颜色 shapes[0].bounds = rect0; //矩形数据赋值 ShapeRect rect1 = {30,40,50,60}; shapes[1].type = kRectangle; shapes[1].fillColor = kGreenColor; shapes[1].bounds = rect1; //鸡蛋数据赋值 ShapeRect rect2 = {15,18,37,29}; shapes[2].type = kEgg; shapes[2].fillColor = kBlueColor; shapes[2].bounds = rect2; //绘制几何体 drawShapes(shapes,3); } return 0; } //面向过程方式drawShapes void drawShapes(Shapes shapes[],int count) { for(int i=0;i<count;i++) { switch(shapes[i].type){ case kCircle: drawCircle(shapes[i].bounds,shapes[i].fillColor); break; case kRectangle: drawRectangle(shapes[i].bounds,shapes[i].fillColor); break; case kEgg: drawEgg(shapes[i].bounds,shapes[i].fillColor); break; case kTriangle: drawkTriangle(shapes[i].bounds,shapes[i].fillColor); break; } } }

从书中的例子可以看出,面向过程编程中,如果我们要让程序扩展一下,比如不仅能绘制各种形状,还必须计算这些形状的面积,并判断鼠标光标是否位于这些形状中。在这种情况下,就必须修改每个对形状执行操作的函数,修改过去正常工作的代码很可能引入新的错误,所以在这点上面向过程编程极其不方便,就需要用到OOP(面向对象编程)概念了。

面向对象编程

面向对象编程则以程序的数据为中心函数为数据服务。在OOP中,不再重点关注程序中的函数,而是专注于数据。

在OOP中,数据通过间接方式引用代码,什么意思呢?

就是代码可以对数据进行操作,不是向面向过程那样,通知drawRectangle函数绘制一个根据这种形状的图形,而是要求形状绘制自身。(借助间接的强大功能,这些数据能够知道如何查找相应的函数来进行绘制)。

对象是什么?

就是和C语言中的struct一样,神奇的是它能够通过函数指针查找与之相关的代码。

如下图:展示了4种Shape对象:两个正方形、一个圆形和一个椭圆形。(每个对象都能查找相应的函数并实现其绘图功能)

每个对象都有自己的draw函数,知道如何绘制自身的形状。

(我们直接将之前的面向过程代码,改成面向对象的代码,只需要改动一个函数就行。)

void drawShapes(id shapes[],int count) { for(int i=0;i<count;i++) { id shape = shapes[i]; [shape draw]; } }

改完了,代码是不是变的超级简洁啊!

Objective-C教程第三章讲解哪些面向对象编程核心概念?

解释下这段代码的意思,其中id属于OC中的泛型,他有点类似Java中的Object,就是用id可以引用任何类型的对象。

对象是一种包含代码的struct结构体,所以id实际上是一个指向结构体的指针

[shape draw],这一句代码的意思是通知shape对象发送draw消息或者向shape发送draw消息,至于形状如何实际绘制自身的图形,取决于shape的实现。

思考

本文共计1813个文字,预计阅读时间需要8分钟。

Objective-C教程第三章讲解哪些面向对象编程核心概念?

目录 + Objective-C + 基础教程第三章,面向对象编程基础知识 + 0x00 + 前言 + 0x01 + 间接引用(indirection) + 0x02 + 面向对象编程中使用间接引用 + 面向过程编程 + 面向对象编程 + 0x03 + OC面向对象 + 技术语法 + 0x04 + OC语言中的OOP + @int

目录
  • Objective-C 基础教程第三章,面向对象编程基础知识
    • 0x00 前言
    • 0x01 间接(indirection)
    • 0x02 面向对象编程中使用间接
      • 面向过程编程
      • 面向对象编程
    • 0x03 OC面向对象 术语
    • 0x04 OC语言中的OOP
      • @interface
      • @implementation
      • instantiation(实例化对象)
    • 0x05 第三章小节

Objective-C 基础教程第三章,面向对象编程基础知识 0x00 前言

书中的这章节主要是对零基础的人介绍面向对象编程的基础知识,一般学过高级编程语言的基本都会涉及到面向对象编程的知识,所以可以略过。

术语:OOP的解释

面向对象编程(Object-Oriented Programming)的首字母缩写为:OOP,这是一种编程技术,最初是为了编写模拟程序开发的。OOP很快就俘虏了其他种类软件(比如涉及图形用户界面的软件)开发者的心。很快OOP就成为了业内一个非常重要的流行词。它被誉为具有魔力的颜色子弹,可以使编程工作变得简单而愉悦。

在讨论OOP之前,先来看看OOP的一个关键概念:间接(indirection)

0x01 间接(indirection)

间接是一种概念,为什么要用间接从书本上的几个例子中,我大概体会到应该就是为了可变性,比如说我在代码里面有个循环语句,然后有个printf每次输出1-xxx的值,那么我要改循环次数的时候就需要每次将printf里面的xxx改成循环的次数,如果用变量来代替的话我只需要改一次循环次数即可。

还有就是用文件间接的方式,比如我要输出一堆数据,都需要提前定义一个列表或者数组,那么需求有变动的时候我就要每次改这些变量里面的值,但是如果我程序从文件里面读取这些数据,我只需要修改下文件里面的内容即可,所以可变动性就特别好。

0x02 面向对象编程中使用间接

在书中看完间接的知识后, 对间接的概念大致有了个了解。在面向对象编程中(OOP),间接可以说是他的核心。

OOP使用间接来获取数据,就像我们在之前的例子中使用变量、文件和参数所做的那样。OOP真正的革命性在于它使用间接来调用代码!不是直接调用某个函数,而是用间接调用!

只要理解了这一点,你就算掌握了OOP的内涵了。其他一切都是通过间接产生的引申效果。

面向过程编程

首先来看两个例子,分别是面向过程编程和面向对象编程的代码,书中说到:过程式编程建立在函数之上,数据为函数服务。

//********************************************************************* //利用纯C语言和过程式编程方式绘制几何体的形状。 // //《Object-C 基础教程》 03.08 Shapes-Procedural //********************************************************************** #import <Foundation/Foundation.h> //----------------------------------------变量声明---------------------------------- //几何体形状类型 typedef enum{ kCircle, //圆圈 kRectangle,//矩形 kEgg, //鸡蛋 }ShapeType; //几何体颜色类型 typedef enum{ kRedColor, //红色 kGreenColor,//绿色 kBlueColor, //蓝色 }ShapeColor; //几何体轮廓结构体 typedef struct{ int x,y,width,height; }ShapeRect; //几何体结构体 typedef struct{ ShapeType type; ShapeColor fillColor; ShapeRect bounds; }Shape; void drawShapes(Shape shapes[],int num) //------------------------------------------------------------------------------- //入口点代码 int main(int argc, const char * argv[]) { @autoreleasepool { Shape shapes[3]; //圆形数据赋值 ShapeRect rect0 = {0,0,10,30}; //x,y坐标与宽和高数据 shapes[0].type = kCircle; //几何体类型 shapes[0].fillColor = kRedColor;//几何体颜色 shapes[0].bounds = rect0; //矩形数据赋值 ShapeRect rect1 = {30,40,50,60}; shapes[1].type = kRectangle; shapes[1].fillColor = kGreenColor; shapes[1].bounds = rect1; //鸡蛋数据赋值 ShapeRect rect2 = {15,18,37,29}; shapes[2].type = kEgg; shapes[2].fillColor = kBlueColor; shapes[2].bounds = rect2; //绘制几何体 drawShapes(shapes,3); } return 0; } //面向过程方式drawShapes void drawShapes(Shapes shapes[],int count) { for(int i=0;i<count;i++) { switch(shapes[i].type){ case kCircle: drawCircle(shapes[i].bounds,shapes[i].fillColor); break; case kRectangle: drawRectangle(shapes[i].bounds,shapes[i].fillColor); break; case kEgg: drawEgg(shapes[i].bounds,shapes[i].fillColor); break; case kTriangle: drawkTriangle(shapes[i].bounds,shapes[i].fillColor); break; } } }

从书中的例子可以看出,面向过程编程中,如果我们要让程序扩展一下,比如不仅能绘制各种形状,还必须计算这些形状的面积,并判断鼠标光标是否位于这些形状中。在这种情况下,就必须修改每个对形状执行操作的函数,修改过去正常工作的代码很可能引入新的错误,所以在这点上面向过程编程极其不方便,就需要用到OOP(面向对象编程)概念了。

面向对象编程

面向对象编程则以程序的数据为中心函数为数据服务。在OOP中,不再重点关注程序中的函数,而是专注于数据。

在OOP中,数据通过间接方式引用代码,什么意思呢?

就是代码可以对数据进行操作,不是向面向过程那样,通知drawRectangle函数绘制一个根据这种形状的图形,而是要求形状绘制自身。(借助间接的强大功能,这些数据能够知道如何查找相应的函数来进行绘制)。

对象是什么?

就是和C语言中的struct一样,神奇的是它能够通过函数指针查找与之相关的代码。

如下图:展示了4种Shape对象:两个正方形、一个圆形和一个椭圆形。(每个对象都能查找相应的函数并实现其绘图功能)

每个对象都有自己的draw函数,知道如何绘制自身的形状。

(我们直接将之前的面向过程代码,改成面向对象的代码,只需要改动一个函数就行。)

void drawShapes(id shapes[],int count) { for(int i=0;i<count;i++) { id shape = shapes[i]; [shape draw]; } }

改完了,代码是不是变的超级简洁啊!

Objective-C教程第三章讲解哪些面向对象编程核心概念?

解释下这段代码的意思,其中id属于OC中的泛型,他有点类似Java中的Object,就是用id可以引用任何类型的对象。

对象是一种包含代码的struct结构体,所以id实际上是一个指向结构体的指针

[shape draw],这一句代码的意思是通知shape对象发送draw消息或者向shape发送draw消息,至于形状如何实际绘制自身的图形,取决于shape的实现。

思考