首页 > 其他 > 详细

OC中的继承关系

时间:2015-11-19 14:47:38      阅读:246      评论:0      收藏:0      [点我收藏+]

继承就是父类与子类的关系,在oc中一切的类都是NSObject的子类,父类有的方法,子类没有必要在声明,可以直接使用,如果不对方法重新实现,子类在调用该方法的时候,将完全实现父类的功能。

 // 子类一定比父类的能力更强大

// 通常用父类指针指向子类是可以的,相当于把能力少的来使用,相反就不可以了,下面我们就以几个类为例子来说明这一系列问题,来建立一个人类,在建立两个类(分别是老师和学生),两都是人的子类。

主函数(方法调用)

#import <Foundation/Foundation.h>

#import "HHStudent.h"

#import "HHTeacher.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

#if 0

        // 子类一定比父类的能力更强大

        // 通常用父类指针指向子类是可以的,相当于把能力少的来使用

        HHPerson *student = [HHStudent studentWithName:@"奈何桥" age:@(18) grade:@"primary"];

        [student play:@"LOL"];

        [student eat:@"appple"];

        //父类中没有学习方法,要使用(父类的指针指向子类的方法)要使用以下方法解决问题

        // 用选择器

        if ([student respondsToSelector:@selector(study:)]) {

            [student performSelector:@selector(study:) withObject:@"Engliash"];

        }

        // 强制类型转换

        [(HHStudent *)student study:@"Engliash"];

        HHPerson *teacher = [HHTeacher teacherWithName:@"李老师"age:@(30) professionalTitle:@"教授"];

        // 下面的代码编译不会出问题,运行时会崩溃

        // [(HHTeacher *)student teach:@"math"];

        

        [teacher play:@"basketball"];

        [teacher eat:@"banana"];

        [(HHTeacher *)teacher teach:@"生理学"];

#endif

        HHPerson *p1 = [HHTeacher teacherWithName:@"张三" age:@(30) professionalTitle:@"讲师"];

        HHPerson *p2 = [HHStudent studentWithName:@"李韦" age:@(20) grade:@"大一"];

        HHPerson *p3 = [HHStudent studentWithName:@"张伟" age:@(50) grade:@"大三"];

        NSArray *person = @[p1,p2,p3];

        for (HHPerson *temperson in person) {

            [temperson eat:@"吃西餐"];

            [temperson play:@"麻将"];

            // 运行时类型识别(RTTI)

            if ([temperson isKindOfClass:[HHStudent class]]) {

                // 强制类型转

                [(HHStudent *)temperson study:@"oc语言"];

            }

            else if ([temperson isKindOfClass:[HHTeacher class]]){

                [(HHTeacher *)temperson teach:@"JSON数据解析"];

            }

        }

    }

    return 0;

}

 

 父 类(人类)

#import <Foundation/Foundation.h>

/**

 *  人类

 */

@interface HHPerson : NSObject

/**

 *  姓名

 */

@property (nonatomic,copy) NSString *name;

/**

 *  年龄

 */

@property (nonatomic,strong) NSNumber *age;

 

/**

 *  吃东西

 *

 *  @param foodName 东西的名字

 */

- (void)eat:(NSString *)foodName;

/**

 *  玩游戏

 *

 *  @param gaemeName 游戏名字

 */

- (void)play:(NSString *)gaemeName;

/**

 *  初始化方法

 *

 *  @param name 姓名

 *  @param age  年龄

 *

 *  @return 返回一个具体的人

 */

- (instancetype)initWithName:(NSString *) name age:(NSNumber *) age;

@end 

 

#import "HHPerson.h"

@implementation HHPerson

 

- (instancetype)initWithName:(NSString *)name age:(NSNumber *)age{

    if (self = [super init]) {

        _name = name;

        _age = age;

    }

    return self;

}

 

- (void)eat:(NSString *)foodName{

    NSLog(@"年龄为%@名字为%@正在吃%@",_age,_name,foodName);

}

 

- (void)play:(NSString *)gaemeName{

    NSLog(@"年龄为%@名字为%@正在玩%@",_age,_name,gaemeName);

}

@end

 子 类(老师)

/**

 *  老师类

 */

@interface HHTeacher : HHPerson

/**

 *  职称

 */

@property (nonatomic,copy) NSString *professionalTitle;

/**

 *  学习

 *

 *  @param courseName 课程名字

 */

- (void)teach:(NSString *)professionalTitle;

/**

 *  初始化方法

 *

 *  @param name  姓名

 *  @param age   年龄

 *  @param grade 年级

 *

 *  @return 返回对象

 */

+ (instancetype) teacherWithName:(NSString *)name

                             age:(NSNumber *) age

                           professionalTitle:(NSString *) professionalTitle;

@end

 

@implementation HHTeacher

/**

 *  私有的方法

 *

 *  @param name  学生姓名

 *  @param age   年龄

 *  @param professionalTitle 职称

 *

 *  @return 初始化

 */

- (instancetype)initWithName:(NSString *)name age:(NSNumber *) age professionalTitle:(NSString *) professionalTitle{

    if (self = [super initWithName:name age:age]) {

        professionalTitle= professionalTitle;

    }

    return self;

}

 

+ (instancetype)teacherWithName:(NSString *)name age:(NSNumber *)age professionalTitle:(NSString *)professionalTitle{

    return [[self alloc] initWithName:name age:age professionalTitle:professionalTitle];

}

 

- (void)teach:(NSString *)courseName{

    NSLog(@"%@正在上%@课",self.name,courseName);

}

@end

 

 子 类(学生)

#import <Foundation/Foundation.h>

#import "HHPerson.h"

/**

 *  学生类

 */

@interface HHStudent : HHPerson

 

@property (nonatomic,copy) NSString *grade;

/**

 *  学习

 *

 *  @param courseName 课程名字

 */

- (void)study:(NSString *)courseName;

/**

 *  初始化方法

 *

 *  @param name  姓名

 *  @param age   年龄

 *  @param grade 年级

 *

 *  @return 返回对象

 */

+ (instancetype) studentWithName:(NSString *)name

                          age:(NSNumber *) age

                        grade:(NSString *) grade;

@end

 

#import "HHStudent.h"

 

@implementation HHStudent

/**

 *  私有的方法

 *

 *  @param name  学生姓名

 *  @param age   年龄

 *  @param grade 年级

 *

 *  @return 初始化         

 */

- (instancetype)initWithName:(NSString *)name age:(NSNumber *) age grade:(NSString *) grade{

    //父类的方法初始化

    if (self = [super initWithName:name age:age]) {

        _grade = grade;

    }

    return self;

}

 

+ (instancetype)studentWithName:(NSString *)name age:(NSNumber *)age grade:(NSString *)grade{

    return [[self alloc] initWithName:name age:age grade:grade];

}

 

- (void)study:(NSString *)courseName{

    NSLog(@"年级为%@年龄为%@名字为%@的学生正在努力学习%@",_grade,self.age,self.name,courseName);

}

@end

 

 

OC中的继承关系

原文:http://www.cnblogs.com/yuanwang942217/p/4977391.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!