我的iOS学习历程 - OC第三天

  今天主要讲的是OC继承的使用 创建一个父类 使用其相同的属性来创建子类 子类继承任何父类的属性和方法(点击打开链接 附带一个例题,名字为继承类)

#import<Foundation/Foundation.h>

#import"Person.h"

#import"Student.h"

#import"LStudent.h"

int main(int argc,constchar * argv[]) {

继承的:特性

     1.继承是单向的(从上到下)

     2.继承是可传递的

     3.不能相互继承

     4.不能多继承

     5.继承就是子类继承父类的所有实例变量和方法

继承的:好处

     1.减少代码量提高工作效率

创建人类

学生类继承人类

L学生类 继承学生类

// 创建一个对象
Person *p1 = [[Person alloc]initWithName:@"小明" gander:@"男" age:@"18"];
[p1 sayHi];
// 创建一个学生
Student *s1 = [[Studentalloc]init];
// 学生类中本没有init方法该方法是从基类中继承过来的
// 通过set方法赋值
// 学生类本没有 name这个实例变量和 set方法现在使用的都是从父类(Person)中继承下来的
[s1 setName:@"亚索"];
[s1 setAge:@"18"];
[s1 setGander:@"男"];
[s1 sayHi];
// 给学生加一个学号
[s1 setNumber:@"1"];
[s1 sayHiStudernt];</span>

3.继承中方法的调用

   1.使用self调用方法的时候

优先调用本类中的方法没有继续查找上一级,找到就调用,没有就继续查找都没有就崩溃

    

   2.使用super调用方法的时候

直接跳过本类去查找上一级的父类,找到就调用没有就继续查找都没有就崩溃

super没有一个特殊的意思就是一个编译器指令

    

***************************************************************************************

(peson,h)

#import <Foundation/Foundation.h>
@interfacePerson :NSObject
{
    NSString *_name; // 姓名
    NSString *_gander; // 性别
    NSString *_age; // 年龄
}
//  自定义初始化方法
//  set get 方法
//  sayHi方法(介绍自己)
-(instancetype)initWithName:(NSString *)name
                     gander:(NSString *)gander
                        age:(NSString *)age;
//  名字的set,get方法
-(NSString *)name;
-(void)setName:(NSString *)name;
//  性别的set,get方法
-(NSString *)gander;
-(void)setGander:(NSString *)gander;
//  年龄的set,get方法
-(NSString *)age;
-(void)setAge:(NSString *)age;
//  自我介绍
-(void)sayHi;
@end

(person,m)

<span style="font-size:18px;">#import "Person.h"
@implementation Person
-(instancetype)initWithName:(NSString *)name
                     gander:(NSString *)gander
                        age:(NSString *)age{
    self = [superinit];
    if (self) {
        _name = name;
        _gander = gander;
        _age = age;
    }
    returnself;
}

//  名字的set,get方法
-(NSString *)name{
    return_name;
}
-(void)setName:(NSString *)name{
    _name = name;
}
//  性别的set,get方法
-(NSString *)gander{
    return_gander;
}
-(void)setGander:(NSString *)gander{
    _gander = gander;
}
//  年龄的set,get方法
-(NSString *)age{
    return_age;
}
-(void)setAge:(NSString *)age{
    _age = age;
}
//  自我介绍
-(void)sayHi{
    NSLog(@"我的名字叫%@性别%@今年%@岁",_name,_gander,_age);
}
@end</span>

***************************************************************************************

(Student .h)

<span style="font-size:18px;">#import "Person.h"
@interface Student :Person
{
    NSString *_number;
}
//  自定义初始化
-(instancetype)initWithName:(NSString *)name
                     gander:(NSString *)gander
                        age:(NSString *)age
                     number:(NSString *)number;
//  遍历构造器
+(instancetype)studentWithName:(NSString *)name
                        gander:(NSString *)gander
                           age:(NSString *)age
                        number:(NSString *)number;
//  number set,get方法
-(NSString *)number;
-(void)setNumber:(NSString *)number;
//  自我介绍
-(void)sayHiStudernt;</span>

(Student.m)

<span style="font-size:18px;">#import "Student.h"
@implementation Student
//  自定义初始化
-(instancetype)initWithName:(NSString *)name
                     gander:(NSString *)gander
                        age:(NSString *)age
                     number:(NSString *)number{
// 继承中的自定义初始化方法
// 赋值实例变量的时候需要先判断一下继承是否成功
// 也就是调用父类的初始化方法
self = [superinitWithName:namegander:ganderage:age];
if (self){
// 如果继承成功的话就继续初始化子类中特有的实例变量
        _number = number;
    }
    // 继承失败直接返回就行
    returnself;
}
//  遍历构造器
+(instancetype)studentWithName:(NSString *)name
                     gander:(NSString *)gander
                        age:(NSString *)age
                        number:(NSString *)number{
    Student *stu = [[Studentalloc]initWithName:namegander:ganderage:agenumber:number];
    return stu;
}
//  number set,get方法
-(NSString *)number{
    return_number;
}
-(void)setNumber:(NSString *)number{
    _number = number;
}</span>

    在本类中可以使用关键字self当作本类对象来调用本类中方法(self的调用方法是先从本类中找方法,如果本类中找不到,就去父类找,就这样循环,一直找到基类,找不到就崩溃)

//  自我介绍
-(void)sayHiStudernt{
// 调用这个方法打印全部信息
// 先去调用父类的方法 sayHi然后在打印学好输入完整信息
[supersayHi];
//  super是一个编译器指令可以通过该指令直接跳过本类的方法直接去调用父类的方法(上一级的父类)
NSLog(@"%@",_number);
}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值