接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点。写篇博文总结一下OC中的面向对象。刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点。在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些。

  在下面的代码实例当中,可能在便利初始化方法和便利构造器这一块理解起来有些问题。简单的说来,便利构造器是为了简化对象的初始化而生的,在之前的博客中也说了一嘴:编程是间接的过程,其实使用便利构造器就是间接的过程。在程序中处处都用到了间接。比如你定义的变量,你定义的函数,都是在间接的使用一些东西。在现实生活中间接的作用的很大的,就连找个女朋友也要间接一下,如果间接好了你很有可能和奥巴马成为好哥们不是吗,不是有种理论叫做六度人脉吗?程序中的间接的好处是什么呢?

  根据个人的理解,间接原则会让自己写的代码更为灵活,会避免一些不必要的重复编写代码。函数就是一个最好的例子,把程序中不变且常用的部分进行封装,然后把变的部分用函数的参数列表传进来,这样就很好的实现代码的重用功能,这也是函数存在编程中的意义所在。伪文艺一下,哲学上不是有句话叫做世界上每种存在的事物都有他存在的意义。达尔文的适者生存论放在计算机技术发展中也是挺适用的,能被保留的东西一定会有他的作用。

  言归正传,便利构造器就是对便利初始化函数的间接使用,目的是为了简化对象的初始化(这里是我个人的理解)。便利初始化函数(对象方法)的作用是给实例常量赋初值,在类的实例化后就可以调用便利初始化函数了。而便利构造器是类方法,返回的是对象,在便利构造器中做了两件事:一个是给对象分配空间,第二个是调用便利初始化函数进行数据的初始化。学过设计模式的小伙伴都应该知道“模板方法模式”,我个人感觉便利构造器和模板方法模式的作用挺相似的。

  以下的东西是依附于代码来讲解的,编程吗,即使讲思想也少不了代码不是吗,话不多说,切入正题。请大家批评指正,若要转载请注明出处。

  面向对象程序开发的主要目标:用代码模拟现实中的对象,将现实中对象的某些行为能力,特征用代码表现出来,然后用这些代码来模拟现实中的问题。

  每个对象都会从两个角度进行描述,一个是特征,一个是行为能力

特征:可以是物体的组成部分,也可以是一些物理或逻辑上的属性,用来表现对象的形态,构成及状态。

行为能力:对象所能被进行的操作或者物体本身发起的操作。用来接受外部操作或对外部进行操作。

封装:将属性及方法相结合,共同体现对象的特征,称之为封装,封装可以实现隐藏内部实现,稳定外部接口。

在OC中类是由接口(interface)和实现(implementation)两部分构成的。在OC中类是通过两个单独的文件定义。接口定义在对应的头文件中,该文件的作用是说明此类具有哪些属性和方法,但不去实现其行为。

1. OC中接口的定义如下:

#import <Foundation/Foundation.h>@interface Student : NSObject
{//大括号里定义属性//定义学生的学号,姓名,年龄,爱好;@publicNSString *studentName;int age;NSString *hobby;
}/*定义学生有关的方法,+修饰的为类方法,不用实例化就可以直接用类访问
* -号修饰的为对象方法,必须实例化后才能使用,就是用对象调用的方法
*///定义打招呼的方法
- (void) sayHello;
//吃饭行为
- (void) eat;
@end

代码说明:

1.#import<Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h的头文件

2.用#import指令来导入相应的文件,#import的作用相当于PHP中的require_once,如果文件之前导入过了,则不导入,而#include会重复导入文件的

3.用编译器指令@interface来定义类的声明,@interface后面是类名,Student : NSObject 说明Student继承于NSObject类

4.在接口中方法只有声明,没有实现,方法前面的减号代表此方法是对象方法,如果是+号的话,说明是类方法,就是说类可以直接访问此方法。

5.@interface 和 @end是成对出现的,@end代表接口定义的结束

6.上面得成员变量定义成了公有的,这在开发中是极少见的,这里为了方便练习才这么写的,一般把成员变量定义为私有的然后在定义get,set方法去操作成员变量

      这样才起到了封装,不要把自己的手直接伸入到类中,要通过类提供的方法来操作类的成员变量。

2.@implementation 实现部分

实现部分文件的扩展名为.m,具体实现的方法代码如下:

#import "Student.h"@implementation Student
//实现打招呼的行为
- (void) sayHello
{NSLog(@"hello! 我是%@, 我今年%d岁了, 我喜欢%@!", studentName, age, hobby);
}//实现吃饭行为
- (void) eat
{NSLog(@"%@也得吃饭呢!",studentName);
}@end

代码说明:

1.在实现文件中首先导入对应的类的接口文件#import "Student.h",引入系统文件用<FileName>, 引入自定义文件用“FileName”;

2.用编译器指令@implementation来声明类方法的实现

3.@implementation和@end也是成对出现的

代码规范:

1.类名的首字母要大写

2.方法的命名使用驼峰命名法

3.创建和使用对象

定义了一个类,一般需要实例化才能使用,当然静态类是不需要实例化就能用的。对象是类的实体,类是对象的抽象,因此需要对类进行实例化。

实例化的代码如下:

#import <Foundation/Foundation.h>//引入定义的类
#import "Student.h"int main(int argc, const char * argv[])
{@autoreleasepool {//创建对象,完成对象的声明,内存分配,初始化Student *student = [[Student alloc] init];//为了方便,在这就直接给成员变量赋值,前提是成员变量是公有的student->studentName = @"ludashi";student->age = 20;student->hobby=@"爱咋咋地";//调用成员方法[student sayHello];[student eat];}return 0;
}

​    ​  代码说明:

​    ​    ​    ​1.要在一个类中实例化类,首先要引入类的接口定义文件如上面的 #import “Student.h”;

​    ​    ​    ​2.OC中类的实例化方式是 Student  *student =  [[Student alloc] init], 可以理解为Student类在NSObject类中继承了alloc方法, alloc这个方法是用来

       实例化对象的 ​init 是默认的构造方法

​    ​    ​    ​3.在OC中对象调用其中的方法是通过[]来实现的,[对象名   方法名];

​    ​  定义对象的语法:

​    ​    ​    ​类名    ​*对象名 = [  [ 类名 alloc ] init ];   或者

​    ​    ​    ​类名    ​*对象名 = [ 类名  new];

​    ​  给对象的成员变量赋值和调用对象的方法如下:

​    ​    ​    ​对象名->成员变量名 = 具体值;

​    ​    ​    ​[ 对象名 方法名];

​一:类方法和对象方法

​    ​上面也提到了,减号开头的方法为对象方法,需要实例化类后通过对象来进行调用。对象方法允许调用对象方法和对象变量​加号开头的方法为类方法,通过类就可以直接调用的方法。

​    ​下面是一些方法调用的一些规则:

​    ​    ​    ​1.类方法可以调用类方法;

​    ​    ​    ​2.类方法不可以调用对象方法;

​    ​    ​    ​3.类方法不可以使用对象变量,类方法可以使用self(self相当于java中的this);    ​    ​    ​

​    ​    ​    ​4.可以通过类来调用类方法,但对象不可以调用类方法

​    ​

​    ​1.对象的初始化

​    ​    ​    ​可以重写父类中的方法init来进行对象的初始化,就相当于Java中的构造函数,重写代码如下:

//重写init方法,为本类添加构造方法
-(id) init
{if (self =[super init]){studentName = @"dashi";age = 18;hobby = @"hehe";}return self;
}

​    ​    ​ 代码说明:

​    ​    ​    ​    ​1.因为init是继承过来的方法因此不需要在interface里面声明,直接在implementation中进行重写就OK了;

​    ​    ​    ​    ​2. init的返回类型为id, id是OC中的一切父类.在面向对象中父类可以声明子类的变量

​    ​    ​    ​    ​3.[super init]是为了初始化父类的成员变量,返回值为子类对象,如果返回nil,说明父类没有alloc成功,即不能在alloc子类对象。

​    ​2.便利初始化函数

​    ​    ​自定义的便利初始化函数的作用是让用户自己初始化用户所实例化的对象,便利初始化函数以init开头,我们可以在类中自定义便利初始化函数。因为便利初始化函数是自  己。  ​定义的所以需要在@interface中进行声明,便利初始化函数可以进行重载

​    ​    ​在@implementation中进行重新的代码如下:

//实现便利初始化方法1
- (id) initWithName:(NSString *)sName iAge:(int)anAge
{if (self = [super init]) {studentName = [sName copy];age = anAge;}return self;
}//实现便利初始化方法2
- (id) initWithName:(NSString *)sName
{if (self = [super init]) {studentName = [sName copy];}return self;
}

​    ​  代码说明:

​    ​    ​    ​1.函数名后面的冒号跟的是参数列表,在OC中定义参数的方式是: (参数类型)参数名    第二个参数别名:(参数类型)参数名

​    ​

​    ​使用便利初始化方法来进行对象的初始化,代码如下:

//调用便利初始化方法
Student *s1 = [[Student alloc] initWithName:@"dashi1" iAge:19];
[s1 sayHello];

​3.便利构造器

​上面用便利初始化方法在类实例化时有些繁琐,为了简化实例化的操作,自定义一个类方法,类方法的作用是进行类的实例化同时进行参数的初始化,并返回对象

​    ​便利构造器的实现代码如下:

//实现便利构造器,进行类的实例化并调用initWithName
+ (id) studentWithName:(NSString *)name age:(int)sAge
{Student *student = [[Student alloc] initWithName:name iAge:sAge];return student;
}

​    ​便利构造器的使用如下:

//调用便利构造器初始化对象
Student *s2 = [Student studentWithName:@"dashi2" age:20];

在Objective-C中浅谈面向对象相关推荐

  1. 『软件工程13』浅谈面向对象方法,统一建模语言UML

    浅谈面向对象方法UML 一.UML的含义 二.UML的主要内容 1.UML的概念模型 2.UML概念模型图例 三.UML的基本构造块 1.UML中的事物 (1)UML中的四种事物 (2)UML中各种事 ...

  2. 【c++开篇】浅谈面向对象与面向过程(举例说明)

    浅谈面向对象与面向过程 前言:刚接触C++第一时间,都会经常听到这样一话:C语言面向过程,C++面向对象.在老师模拟面试时,问道你对面向对象与面向过程的认识时,我有点懵答的不是很完整,刚好C++开篇写 ...

  3. 【转】浅谈面向对象的坏处

    转自:https://blog.csdn.net/fishmai/article/details/52079766 1.性能. 现时C++可以说是支持OOP范式中最为常用及高性能的语言.虽然如此,在C ...

  4. 浅谈面向对象开发原则:高内聚,低耦合

    软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低 ...

  5. 浅谈面向对象思想下的 C 语言

    如何使用OO思维方式 面向对象(object Oriented,简称:OO)在于用"找对象"的方式去规划和描述问题. 一.怎样"找对象" (思维过程) &quo ...

  6. 浅谈面向对象的javascript几个特性

    javascript中的this和new javascript是一门很灵活的语言,尤其是function.他即可以以面向过程的方式来用,比如: function getName() {return ' ...

  7. 浅谈面向对象编程与面向过程编程

    面向对象编程 面向对象编程是一种更加复合人们思维方式的编程思想.在现实生活中存在许多不同种类的事物,但是这些事物之间存在着某种联系,我们在使用程序模拟实现这些事物时,就可以通过对象的形式对其进行描述. ...

  8. 浅谈面向对象和面向过程

    1.面向对象   面向过程和面向对象都是对软件分析.设计和开发的一种思想,它指导着人们以不同的方式去分析.设计和开发软件.早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来 ...

  9. 浅谈面向对象的编程思想:如何优雅地把大象装进冰箱?

      许多人刚学编程时,想必都听到过这样的话:"*语言是面向对象的,而***语言是面向过程的".那时的新人还懵懵懂懂,就被大牛或者书上的大牛骗去学了一种听起来很厉害的语言,然而学了半 ...

最新文章

  1. 001-ant design安装及快速入门【基于纯antd的基本项目搭建】
  2. Spring 的 BeanUtils 踩坑记,你是不是遇到过这些问题?
  3. Centos 6.5 64位双网卡绑定
  4. Android Studio缓存文件夹配置
  5. 没有一颗平常心的人千万不要做外贸
  6. csharp: json to csharp
  7. 完成端口(IOCP)详解[1/2](转载)
  8. Linux 编译安装 ghostscript 最新版
  9. Spring学习-Bean的理解
  10. 数值分析及其matlab实现习题答案,数值分析练习题(含答案).doc
  11. ADSL上网速度慢的原因及快速排除方法
  12. 学术论文常用网址,自己收藏和分享给大家
  13. 计算机无法启动安装程序,安装Win10系统提示安装程序无法正常启动怎么办
  14. 发售近一周 华为nova2s口碑惊人
  15. mysql describe 分页_mysql之分页方式了解
  16. 计算机组成原理 光盘中试题答案,白中英计算机组成原理光盘上试题及答案.doc...
  17. 交易委托账本 order book
  18. 怎么卸载影子系统?卸载影子系统解决方法
  19. 旗帜软件工作室2021年年会总结
  20. 华东师大计算机专硕学费,2021年华东师范大学硕士研究生学费标准公示

热门文章

  1. 微软Azure云计算服务主导全球
  2. Poj 1755Triathlon 未Ac,先mark
  3. Java程序练习-Period
  4. ubuntu14.04+CUDA7.5+cuDNN+caffe的超详细完整配置
  5. 信息量、信息熵、交叉熵、KL散度、JS散度、Wasserstein距离
  6. 华为在鸿蒙的另一张王牌,华为的这两张王牌,将助力Mate40系列角逐安卓机皇的位置...
  7. ppsspp模拟java按键_ppsspp 手柄按键映射 北通 BTP
  8. java 维文生成图片_维文、哈萨克文、柯尔克孜文检测 (java实现把UTF-8转为unicode)...
  9. mysql异机备份脚本_mysqldump使用rsync异地全量备份数据库
  10. 捷径app 保存视频_Android N App捷径