Objective-C 继承、初始化方法、便利构造器

继承、初始化方法、便利构造器

今天我们要学习继承 初始化方法 以及遍历构造器 首先我们要理解一些概念性的东西.

继承: 在OC里,继承是单继承的,所谓的单继承就是一个子类继承一个父类,例如我们之前创建的Person类是继承于NSObject的.回顾一下继承的格式

@interface Person : NSObject //在冒号后面是继承的父类. 人继承与NSObject

子类是只能继承一个父类,但父类却可以有多个子类.例如:

@interface Student : Person // 学生继承于Person类

@interface Teacher : Person // 老师继承与Person类  老师,学生都是人类

继承的用处: 可以大大的减轻代码量,同时也将子类所拥有的共性结合到一块了,共有的属性就可以写在父类中,在使用的时候,子类可以直接调用.

例如:人类 老师和学生 他们都会由名字name 性别sex 年龄age等共同的属性,这样就一次性写在父类Person中就可以了.然而子类单独拥有的

属性,就单独的写在自己的类中. 例如老师有工资, 学生交学费 这样不同的属性.

@interface Person : NSObject

{

下面三个实例是老师和学生都共同拥有的,所以写在他们所继承的父类Person里

_name = name;

_sex = sex;

_age = age;

}

@interface Teacher : Person

{

工资是老师单独拥有的属性,所以写在Teacher类中

_salary = salary;

}

@interface Student : Person

{

交学费是学生单独拥有的属性,所以写在student类中

_schooling = schooling;

}

初始化方法:

众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类时,总要提供一个初始化方法,一般大家都是这样写的:

- (id)init

{

self = [super init];

if (self) {

执行一些资源、变量的初始化工作

}

return self;

}

这样一段简单的代码,却有很多可以思考的问题:

1、为什么要通过[super init]来调用父类的初始化方法,父类的初始化方法里又执行了什么东西?

首先,我们知道对象继承的概念,一个子类从父类继承,那么也要实现父类的所有功能,这就是is-a的关系,比如说上面提到的老师(Teacher)和

学生(Student)都是人,那么Teacher和Student就都回有Person的特征和功能。所以在子类的初始化方法中,必须首先调用父类的初始化方法,

以实现父类相关资源的初始化。例如我们在初始化Teacher这一对象时,必须先初始化Person类这一对象,并把结果赋予Teacher,以使Teacher

满足Person这一特征。典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成

之后,即self不为nil的情况下,就可以开始做子类的初始化了。

2、是否一定要提供初始化方法,是否一定要使用init作为初始化方法?

我们在Objective-C中创建一个对象通常使用

Person *per = [[Person alloc] init];

或者

Person *per = [Person new];

new方法是NSObject对象的一个静态方法,根据apple的文档,该方法实际上就是alloc和init方法的组合,实际上二者是一样的,但 apple还是推

荐我们使用第一种方法,为什么呢?因为使用第一种方法,你可以使用自己定义的init方法来做一些初始化,当然,如果子类没有提供 init方法,自

然调用的就是父类的init方法了。所以说,从安全性的角度来收,作为开发者我们在对象使用之前是一定要对对象进行初始化的,因此在定义类的时

候一定要提供初始化方法。但是否一定要使用init作为方法名呢?答案是不一定。使用init作为方法名只是你重写了NSObject的init方法而已,如果

你自己重新定义一个初始化方法,也是完全可以的,只要你在使用的时候记得调用新定义的初始化方法就可以了。

但是,这种方法从设计角度来看我觉得是不可取的。在可复用性方面会比较差,如果确有必要定义一些接受不同参数的初始化方法,我的建

议是,先定义一个init的公用方法,再到其他方法中调用它,如:

- (id)init

{

self = [super init];

if (self) {

}

return self;

}

- (id)initWithName:(NSString *)name

{

[self init];

_name = name;

}

- (id)initWithAge:(NSInteger)age

{

[self init];

_age = age;

}

补充:

在面向对象编程中,如果编写一个类而没有包含构造函数,这个类仍能编译并且完全可以正常使用。如果类没有提供显式的构造函数,编译

器会提供一个默认的构造函数给你。除了创建对象本身,默认构造函数的唯一工作就是调用其超类的构造函数。在很多情况下,这个超类是语言框

架的一部分,如java中的 Object类,objective-c 中的NSObject类。

不论是何种情况,在类中至少包含一个构造函数是一种很好的编程实践,如果类中有属性,好的实践往往是初始化这些属性。

——以上摘自《The Object-Oriented Thought Process》 by Matt Weisfeld

Person *per = [[Person alloc] init];//alloc是类方法,init是实例方法,Person alloc创建了一个对象(per),然后调用per对象的init方法进行该对象的初始化.

- [(id)initWithName: (NSString *)name

age: (NSInteger)age

{

if(self = [super init])

//这里不是判断self与[super init]是否相等,而是判断是否可以成功初始化. 而用if判断下,是位了方式self为空的情况

_name = name;

_age = age;

}

+(id)personWithName: (NSString *)name

age:(NSInteger)age

{

id obj = [[Person alloc] initWithName:name age:age];

//设置obj的值

return obj;

}

//调用方法

Person *per = [Person alloc]personWithName:@"Jack" age:30];

//本方法调用了上方+号类方法,也就是便利构造器的初始化方法

时间: 2024-08-19 06:56:57

Objective-C 继承、初始化方法、便利构造器的相关文章

OC基础:继承.初始化方法,便利构造器

继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的方法,重写父类的方法,在子类中不需要再次声明. 1.完全重写 2.部分重写   使用super 建立继承关系之后,子类可以继承父类的: 1.实例变量,@[email protected]修饰情况之下 2.公开的方法 一个方法如果在.h中声明了,那么这个方法就是公开的方法,如果没有声明,则是私有的.

第三讲.继承,完整初始化方法,遍历构造器,多态(代码) 另附植物大战僵尸练习

//初始化和遍历构造器使用 //person.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 { 6 7 NSString *_name; 8 int _age; 9 NSString *_sex; 10 11 12 } 13 14 +(id)PersonWithName:(NSString*)name age:(int)age; 15 -(id)initWithName:(NSStrin

Objective-C初始化方法

1.初始化方法: #import <Foundation/Foundation.h> @interface Person : NSObject{ NSString *_name; NSInteger _age; } //自定义初始化方法,必须以init开头 - (id)initWithName:(NSString *)name withAge:(NSInteger)age; //打印信息 - (void)showInfo; @end 这里我们定义了一个初始化方法,对名称和年龄进行初始化赋值操作

继承,初始化

继承 初始化方法 继承继承的上层: 父类 ,继承的下层:子类继承是单向的,不能相互继承.继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为子类能继承父类全部的特征和行为.面向对象提供了的继承语法,能够大大简化代码,把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法即可继承既能保证类的完整,又能简化代码,让类与类之间的关系更加紧密. 继承特点OC中只允许单继承没有父类的类称为根类,OC中的根类是NSObject(祖宗). 继承的内容:所有实例变量和方法.如果子类不

OC实例变量初始化方法

OC实例变量初始化方法1. 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx2. 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3.使用实例初始化方法 initWith开头的方法4.使用构造器 类名+With…以Person  Student两个类为例1. 使用实例 setter方法这是最麻烦的方法 @interface Person : NSObject { NSString *_name; NSString *_sex

继承、初始化?方法、便利构造器

继承特点 OC中只允许单继承. 没有?父类的类称为根类,OC中的根类是NSObject(祖宗). 继承的内容:所有实例变量和?方法. 如果?子类不满意?父类?方法的实现,可以重写(overwrite)?父 类的?方法. 继承具有传递性 完成初始化方法 - (void)init { //给super发送init消息:即执行父类中实现的init方法 self = [super init]; if (self) { //初始化设置 } //返回初始化完成的对象 return self; } 上面称作

Objective-C学习笔记_继承、初始化方法、便利构造器

一.继承 继承的上层:父类,继承的下层:子类.继承是单向的,不能相互继承.继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和?为.子类能继承父类全部的特征和行为. 例题 打僵尸.需求: 1.定义普通僵尸类: 实例变量:僵尸总血量.僵尸每次失血量. 方法:初始化方法(总血量).被打击失血.死亡. 2.定义路障僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道具,弱点. 方法:初始化方法(总血量).被打击失血.失去装备.死亡. 3.定义铁桶僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道

OC03-继承,便利构造器,初始化方法

继承 继承 继承的主要作用就是保证类的完整以及简化代码. 使用时把公共的方法和实例变量写在父类里,子类只需要写自己独有的实例变量和方法就行 特点: 只允许单继承 OC中的根类是NSObject 继承的内容:是所有实例变量和方法 如果子类中不想用父类方法的实现,可以重写方法 注意: 继承的上层是父类,下层是子类 继承是单向的,不能相互继承 继承是有传递性的,即如果A继承于B,B继承于C,A就具有B和C的特征和行为 子类可以继承父类全部的特征和行为 继承的实现 #import <Foundation

Objective-C( 继承,初始化方法)

一.继承 1.继承的上层:父类,继承的下层:子类 2.继承是单向的 3.继承具有传递性:子类继承父类的特征和行为 4.子类扩展父类,更加具体 oc中的继承 1.oc中的继承,即一个类继承另一个类: 2.被继承的类称为父类或超类: 3.继承的类为子类 继承的特点 1.oc中只允许单继承 2.没有父类的类称为根类.oc中的根类是  NSObject 3.继承的内容:除了私有变量外的所有实例变量和方法 4.子类可以重写父类的方法 super 1.oc中的关键字 2.作用:给super发送消息,可执行父