类的扩展(一):继承

来源:互联网 发布:淘宝电子发票在哪里 编辑:程序博客网 时间:2024/05/19 03:19

OC中,继承于NSObject的类统称为 model 类(存字符串)

OC中,只允许单继承,无多继承,协议是间接地实现多继承的方式

继承所有的实例变量和方法,子类可以重写父类的方法


例子:Student继承于Person

Person.h文件

#import <Foundation/Foundation.h>@interface Person : NSObject{    NSString *_name;    NSString *_sex;  // default is male    NSInteger _age;}// 非重写的初始化方法需要进行声明- (instancetype)initWithSex:(NSString *)sex;- (instancetype)initWithName:(NSString *)name;- (instancetype)initWithAge:(NSInteger)age;- (instancetype)initWithAge:(NSInteger)age sex:(NSString *)sex;- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex;- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;// 便利构造器+ (instancetype)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;- (void)eat;- (void)toilet;@end
Person.m文件

#import "Person.h"@implementation Person// 子类如果继承父类,那么在子类的初始化方法中(内部)必须调用父类的初始化方法// 指定指派初始化方法,可以用来纠错// 这个初始化方法为指派初始化方法,sex是必须有的- (instancetype)initWithSex:(NSString *)sex{    // self, super均为去调用这个实例化方法的对象    self = [super init];    if (self) {        _sex = sex;    }        return self;}// 非重写的初始化方法需要进行声明// 在非指派初始化方法中,自己本身调用指派初始化方法// 在这些方法中 无sex时,需要赋一个默认值- (instancetype)init{    self = [self initWithSex:@"male"];        return self;}//- (instancetype)initWithName:(NSString *)name//{//    self = [self initWithSex:@"male"];//    if (self) {//        _name = name;//    }//    //    return self;//}- (instancetype)initWithName:(NSString *)name{    // 在调用时,也可通过调用自身的init方法来调用指派初始化方法    self = [self init];    if (self) {        _name = name;    }        return self;}- (instancetype)initWithAge:(NSInteger)age{    self = [self init];    if (self) {        _age = age;    }        return self;}- (instancetype)initWithAge:(NSInteger)age sex:(NSString *)sex{    self = [self initWithSex:sex];    if (self) {        _age = age;    }        return self;}- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex{    self = [self initWithSex:sex];    if (self) {        _name = name;    }        return self;}- (instancetype)initWithName:(NSString *)name age:(NSInteger)age{    self = [self init];    if (self) {        _name = name;        _age = age;    }        return self;}- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age{    self = [self initWithSex:sex];    if (self) {        _name = name;        _age = age;    }        return self;}// 便利构造器 + (instancetype)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age{    Person *per = [[Person alloc] initWithName:name sex:sex age:age];    [per eat];        return per;}- (void)eat{    NSLog(@"吃五谷杂粮");        // 哪一个对象去调用一个实例化方法,那么在这个实例化方法中的self就是这个对象本身,不管这个方法是父类的还是子类的(Student调用就是stu,Person调用就是per)    NSLog(@"self = %@", self);    //    [self toilet];}- (void)toilet{    // 谁去调用这个实例化方法,这个实例化方法中的self就是谁    NSLog(@"next self = %@", self);}@end
Student.h文件

#import <Foundation/Foundation.h>// 引入Person.h文件#import "Person.h"@interface Student : Person// 子类 : 父类@end
Student.m文件
#import "Student.h"@implementation Student- (instancetype)init{    self = [super init];        return self;}// 重写父类方法,不需要再次声明- (void)eat{    // 子类对象调用父类方法,super代表子类对象 也要完成父类的东西    [super eat];    NSLog(@"吃果蔬");    NSLog(@"func = %s", __func__);}- (void)toilet{    NSLog(@"上厕所");    NSLog(@"__func__ = %s", __func__);}@end
main文件
#import <Foundation/Foundation.h>#import "Person.h"#import "Student.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                Person *per = [[Person alloc] init];        [per eat];        NSLog(@"per = %@\n\n", per);                // Student类继承于Person类        Student *stu = [[Student alloc] init];        [stu eat];        [stu toilet];        NSLog(@"stu = %@\n\n", stu);                // 父类不能强转为子类 去调用子类的方法        Person *pp = [[Person alloc] init];//        [pp toilet];//        [(Student *)pp toilet];                // 子类可以强转为父类        // 如果子类没有重写父类的方法,那么执行父类的方法        // 如果子类重写了父类的方法,那么执行子类重写的方法        Student *ss = [[Student alloc] init];        [(Person *)ss toilet];            }    return 0;}

打印结果:

吃五谷杂粮

self = <Person: 0x100202850>

per = <Person: 0x100202850>


吃五谷杂粮

self = <Student: 0x100107090>

吃果蔬

__func__ = -[Student eat]

next self = <Student: 0x100107090>

上厕所

__func__ = -[Student toilet]

stu = <Student: 0x100107090>


next self = <Student: 0x10010c320>

上厕所

__func__ = -[Student toilet]



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 画裤子上街私处怎么办 皮子背包掉颜色怎么办 gta5车子炸了怎么办 gta5钱多了怎么办 gta5技工不送车怎么办 考警察视力不行怎么办 警察经常熬夜该怎么办 武警部队中队长乱情怎么办 气动铆钉枪卡钉怎么办 汽车遥控器丢码怎么办 电表电池欠压怎么办 电表显示d0该怎么办 打印机打不出来怎么办 羽绒服内里跑绒怎么办 奥迪冷冻液不足怎么办 奥迪冷冻液报警怎么办 电脑输入时乱码怎么办 电信路由器坏了怎么办 高铁坐错车次了怎么办 数字万用表显示1怎么办 滚筒冼衣机接水接头漏水怎么办 奶块设备被禁封怎么办 奶块设备封禁怎么办 晚上衣服干不了怎么办 3dmax视图混乱怎么办 钉枪能打进肉里怎么办 公司迟发工资怎么办 打枪后一直耳鸣怎么办 打枪震的耳鸣怎么办 尚方宝剑弄丢了怎么办 九五出款被黑18w怎么办 很容易感动伤感哭怎么办 为什么安卓版ps打不开怎么办 遇见职业打假人怎么办 打假投诉极限次怎么办 导师无故留学生要怎么办 孩子24了不争气怎么办 退休工资卡遗失怎么办大同市 天津体育惠民卡怎么办 高跟鞋走路太响怎么办 高跟鞋太响怎么办妙招