您的位置:首页 > 其它

OC03_继承

2015-09-01 19:33 561 查看
新建一个Zombie类.

Zombie.h

//
//  Zombie.h
//  OC03_继承
//
//  Created by dlios on 15/9/1.
//  Copyright (c) 2015年 sOldiers. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Zombie : NSObject
{
NSInteger _hp;
NSInteger _mp;
NSInteger _level;
NSInteger _exp;
}

- (void)bite;

- (void)printZombie;

- (NSInteger)hp;
- (void)setHp:(NSInteger)hp;

- (NSInteger)mp;
- (void)setMp:(NSInteger)mp;

- (NSInteger)level;
- (void)setLevel:(NSInteger)level;

- (NSInteger)exp;
- (void)setExp:(NSInteger)exp;

- (instancetype)initWithHp:(NSInteger)hp
mp:(NSInteger)mp
level:(NSInteger)level
exp:(NSInteger)exp;

@end


Zombie.m

//
//  Zombie.m
//  OC03_继承
//
//  Created by dlios on 15/9/1.
//  Copyright (c) 2015年 sOldiers. All rights reserved.
//

#import "Zombie.h"

@implementation Zombie

#pragma mark - Normal Method
- (void)bite {
NSLog(@"咬一口");
}

- (void)printZombie {
NSLog(@"hp : %ld, mp : %ld, level : %ld, exp: %ld", _hp, _mp, _level, _exp);
}

#pragma mark - Setter & Getter
- (NSInteger)hp {
return _hp;
}
- (void)setHp:(NSInteger)hp {
_hp = hp;
}

- (NSInteger)mp {
return _mp;
}
- (void)setMp:(NSInteger)mp {
_mp = mp;
}

- (NSInteger)level {
return _level;
}
- (void)setLevel:(NSInteger)level {
_level = level;
}

- (NSInteger)exp {
return _exp;
}
- (void)setExp:(NSInteger)exp {
_exp = exp;
}

#pragma mark -  initialization Method
- (instancetype)initWithHp:(NSInteger)hp
mp:(NSInteger)mp
level:(NSInteger)level
exp:(NSInteger)exp {
// 完整版的初始化方法,要初始化父类和子类的成员变量.
// 1.初始化父类的成员变量.
self = [super init];
// 2.初始化本类的成员变量.
// 以下三种在此可以说是一个意思.
[self setHp:hp];
self.hp = hp;
_hp = hp;

// 3.判断父类初始化成功之后,再初始化子类内容.
if(self) {
_mp = mp;
_level = level;
_exp = exp;
}

return self;
}

@end


main.m

// 创建一个僵尸类,并调用bite方法.
Zombie *z = [Zombie alloc] init];
[z bite];


新建一个IronZombie类,继承于Zombie.

IronZombie.h

//
//  IronZombie.h
//  OC03_继承
//
//  Created by dlios on 15/9/1.
//  Copyright (c) 2015年 sOldiers. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Zombie.h"

// 接口文件    类名        父类名
@interface IronZombie : Zombie
{

NSString *_equipment;
}

- (void)bite;

// 以下四种方法的声明可以不写,因为父类中已有.
- (NSInteger)hp;
- (void)setHp:(NSInteger)hp;

- (NSInteger)mp;
- (void)setMp:(NSInteger)mp;

- (NSInteger)exp;
- (void)setExp:(NSInteger)exp;

- (NSInteger)level;
- (void)setLevel:(NSInteger)level;

// 子类自己特有的行为要写,子类中的自定义初始化方法也要重新写,注意区别于父类已有的行为.
- (NSString *)equipment;
- (void)setEquipment:(NSString *)equipment;

- (instancetype)initWithHp:(NSInteger)hp
mp:(NSInteger)mp
exp:(NSInteger)exp
level:(NSInteger)level
equipment:(NSString *)equipment;

- (void)printIronZombie;

@end


IronZombie.m

//
//  IronZombie.m
//  OC03_继承
//
//  Created by dlios on 15/9/1.
//  Copyright (c) 2015年 sOldiers. All rights reserved.
//

#import "IronZombie.h"

@implementation IronZombie

- (void)bite {
// 继承父类的方法后,如果不满意父类的方法,可以在子类中写一个和父类方法名一致的方法,重新实现相对的操作.
// 这种操作称之为:方法的重写.
NSLog(@"咬我呀!~");

// super 编译器指令
// 调用当前类中从父类继承过来的方法.
[super bite];

[super setHp:100];
NSLog(@“%ld”, [super hp]);
}

// 以下四种方法的实现可以不写,因为父类中已有.
- (NSInteger)hp {
return _hp;
}
- (void)setHp:(NSInteger)hp {
_hp = hp;
}

- (NSInteger)mp {
return _mp;
}
- (void)setMp:(NSInteger)mp {
_mp = mp;
}

- (NSInteger)exp {
return _exp;
}
- (void)setExp:(NSInteger)exp {
_exp = exp;
}

- (NSInteger)level {
return _level;
}
- (void)setLevel:(NSInteger)level {
_level = level;
}

// 子类自己特有的行为要写,子类中的自定义初始化方法也要重新写,注意区别于父类已有的行为.
- (NSString *)equipment {
return _equipment;
}
- (void)setEquipment:(NSString *)equipment {
_equipment = equipment;
}

- (instancetype)initWithHp:(NSInteger)hp
mp:(NSInteger)mp
exp:(NSInteger)exp
level:(NSInteger)level
equipment:(NSString *)equipment {

// 可以这么写,但是太麻烦.
//    _hp = hp;
//    _mp = mp;
//    _exp = exp;
//    _level = level;
//    _equipment = equipment;

// 我们调用父类的自定义初始化方法,只写子类特有的行为即可
self = [super initWithHp:hp mp:mp level:level exp:exp];
if (self) {
_equipment = equipment;
}

return self;
}

- (void)printIronZombie {
NSLog(@"hp : %ld, mp : %ld, level : %ld, exp : %ld, equipment : %@", _hp, _mp, _level, _exp, _equipment);
}

@end


main.m

// 创建一个铁桶僵尸类,并调用bite方法.
IronZombie *ironZ = [IronZombie alloc] init];
[ironZ bite];

/*
* 继承关系
* 继承:子类拥有父类所有的成员变量和方法.
* 单根继承:在OC中,类有且只有一个父类,没有父类的类是NSObject,叫做根类(祖宗类).
* 传递性:继承关系只针对两个类来说,在描述子类还是父类时,需要相对于某个类描述,类的内容也只分为两部分,本类内容和父类内容.
* 单向性:子类和父类的继承关系一旦确认,不能不换.
* super:调用父类的方法.
* self:调用本类的方法.
*/


Zombie.h

便利构造器.

// id
// 无参数
// 加号,属于类方法.
// 以小写类名开头.
+ (instancetype)zombie;

// 带参数
+ (instancetype)zombieWithHp:(NSInteger)hp
mp:(NSInteger)mp
level:(NSInteger)level
exp:(NSInteger)exp;

@end


Zombie.m

#pragma mark Conventent Method

+ (instancetype)zombie {
return [[Zombie alloc] init];
}

+ (instancetype)zombieWithHp:(NSInteger)hp
mp:(NSInteger)mp
level:(NSInteger)level
exp:(NSInteger)exp {
// 1.普通版
Zombie *zb = [[Zombie alloc] initWithHp:hp mp:mp
level:level exp:exp];
return zb;

// 2.粗暴版
return [[Zombie alloc] initWithHp:hp mp:mp level:level
exp:exp];
}

@end


main.m

// 定义一个Zombie类的对象zb.
Zombie *zb = [[Zombie alloc] init];

// 用类调用,无参数的便利构造器的方法.
Zombie *zb1 = [Zombie zombie];

// 用类调用,有参数的便利构造器的方法.
Zombie *zb2 = [Zombie zombieWithHp:800 mp:200 level:100 exp:80];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: