您的位置:首页 > 其它

OC继承

2013-09-29 16:36 176 查看
1、成员访问类型

private:私有成员,不能被外部函数访问(使用),也不能被子类继承;

protected:保护成员,不能被外部函数访问,可以被子类继承;

public:公有成员,可以被外部函数访问,也可以被子类继承。

OC中,所有的方法(消息),都是公有的。

2、重写(继承的另一部分)

子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法,叫做重写。

重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

//父类声明文件
#import <Foundation/Foundation.h>
@interface Father : NSObject
-(void)run;
-(void)jump;
@end

//父类实现文件
#import "Father.h"
@implementation Father
-(void)run{
NSLog(@"he is running!");
return;
}
-(void)jump{
NSLog(@"father can jump 1.2m");
}
@end


//子类声明文件
#import "Father.h"

@interface Son : Father

@end

//子类实现文件
#import "Son.h"

@implementation Son
-(void)jump{
NSLog(@"he can jump 0.6m");
}
@end


其中,子类重写父类的jump方法,不需要重新声明。

同一个方法,不同的实现,称为多态。重写是多态的一种。

继承的好处:

  1)创建大量的相似类的时候,可以节省工作量。

  2)使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

注意:NSString、NSArray、NSDictionary都是不能够继承的。

3、虚方法

OC的方法都是虚方法

  1)父类的指针可以指向子类的对象

Son * son = [[Son alloc] init];
Father * p = son;


上面p和son都指向子类的对象;调用方法时,不看指针,看对象,对象的地址指向什么对象,就调用什么方法,称为虚方法。

  2)调用方法时,不看指针看对象,这样的方法叫做虚方法。虚方法的好处:可以描述不同事物被相同事件触发,产生不同的响应(结果)。体会下面的例子

动物的父类声明与实现

//动物类声明
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)beBeaten;
@end


//动物类实现
#import "Animal.h"
@implementation Animal
-(void)beBeaten{
return;      //该方法需要子类实现,所以父类不需要写任何实现代码
}
@end


子类(狗)的声明与实现

#import "Animal.h"

@interface Dog : Animal

@end


#import "Dog.h"

@implementation Dog
//该方法在父类已经声明,所以子类不需要重复声明
-(void)beBeaten{
NSLog(@"wang,wang...");
}
@end


子类(猫)的声明与实现

#import "Animal.h"

@interface Cat : Animal

@end


#import "Cat.h"

@implementation Cat
//该方法在父类已经声明,所以子类不需要重复声明
-(void)beBeaten{
NSLog(@"miao,miao...");
}
@end


人类的声明与实现

#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Human : NSObject
//调用该方法,此处只写一个父类的指针就可以,这是利用了父类的虚方法;
//不然,需要写多个方法实现:beatAnimal:(Dog *)dog;beatAnimal:(Cat *)cat;打不同的动物需要传不同的对象,所以利用虚方法、父类的指针是非常方便的
-(void)beatAnimal:(Animal*)animal;
@end


#import "Human.h"

@implementation Human
-(void)beatAnimal:(id)animal{
NSLog(@"Human beat the %@",[animal class]);
[animal beBeaten];
}
@end


Dog * dog = [[Dog alloc] init];
Cat * cat = [[Cat alloc] init];
Human * xiaoming = [[Human alloc] init];
[xiaoming beatAnimal:dog];
[xiaoming beatAnimal:cat];
//输出:
//2013-09-29 15:51:00.604 OC[752:303] Human beat the Dog
//2013-09-29 15:51:00.619 OC[752:303] wang,wang...
//2013-09-29 15:51:00.620 OC[752:303] Human beat the Cat
//2013-09-29 15:51:00.621 OC[752:303] miao,miao...


结题!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: