[Objective-C] 03.OC中的继承和初始化方法

继承:
  1. 基本概念:
    继承的上层是:父类。继承的下层是:子类。
    继承是单向的,不可以A继承B,B还继承A。
    继承具有传递性,子类继承父类的的特征和行为。
    子类扩展了父类,使特征和行为更加的具体。
  2. OC中的继承:
    OC中的继承,即一个类继承自另一个类。
    被继承的类成为父类或超类。
    继承的类成为子类。
  3. 继承的特点:
    OC中只允许单继承。
    没有父类的类成为根类,OC中的根类是NSObject(祖宗类)。
    继承自父类的内容:除了私有变量外的所有实例变量和方法。
    子类可以重写父类的方法。
  4. 继承的传递性:
    B类继承A类,C类继承B类,D类继承C类。然后,D类拥有C类、B类、A类三个类中除私有变量之外的所有实例变量和方法。
  5. 继承中方法的执行顺序:
    a. 查找本类中是否实现了要执行的方法。
    b. 如果没有,去父类中查找。
    c. 逐级向上找,找到即执行。
    d. 如果没有找到,则报错。
  6. super关键字:
    描述:只是OC中的关键字,不是父类对象,只是用来调用父类中的方法。
    作用:给super发消息,可以执行父类中实现的方法。



初始化方法:
  1. 完整的初始化方法:

    #pragma mark 完整的初始化方法

    - (id)init

    {

        // 执行父类中的init方法

        self = [super init];

        if (self) {

            // 初始化设置

            

        }

        // 返回初始化完成的对象

        return self;

    }

  2. 初始化过程:
    a. 执行父类中实现的初始化方法。(向上递归到NSObject类中的初始化方法)
    b. 从根类NSObject开始执行初始化方法。
    c. 判断父类中的初始化是否成功,即self是否存在。
    d. 完成对象的初始化设置,返回对象。
  3. 灵活使用初始化方法,可以在初始化时候设置一些实例变量:

    #pragma mark 灵活使用初始化方法

    #pragma mark 初始化时设置学生姓名

    - (id)initWithStudentName:(NSString *) name

    {

        self = [super init];

        if (self) {

            _name = name;

        }

        return self;

    }

    #pragma mark 初始化时设置学生姓名和学号

    - (id)initWithStudentName:(NSString *)name withStuNum:(NSInteger)stuNum

    {

        self = [super init];

        if (self) {

            _stuNum = stuNum;

            _name = name;

        }

        return self;

    }




遍历构造器:
  1. 声明和实现:

    #pragma mark 声明便利构造器

    + (id)personWithName:(NSString *) name;

  2. #pragma mark 实现便利构造器

    + (id)personWithName:(NSString *)name

    {

        Person *person = [[Person allocinitWithName:name];

        return person;

    }

  3. 使用便利构造器:

    // 使用遍历构造器创建Person对象

    Person *person = [Person personWithName:@"张三"];

  4. 特点:
    便利构造器是类方法。
  5. 便利构造器命名规则:
    使用驼峰命名法,方法名以类名开头。


多态:
  1. 什么是多态?
    早上我和同事说口渴,想喝水。结果:A同事拿着我的杯子去给我接了一杯水。B同事顺手在饮水机上拿了一次性纸杯给我接了杯水。C同事给了我一瓶他早上刚买的饮料。同事得到的是同样地请求,但是三个人都有各自的解决办法,这就是多态。
    多态就是不同对象在响应同一个请求时候不同的实现。父类指针可以指向子类对象。
  2. 实现:
    定义Animal类,和它的子类,Cat、Dog类:
    /// Animal.h:

    #import

    @interface Animal : NSObject

    #pragma mark 声明动物吃东西的方法

    - (void)eat;

    @end

    /// Animal.m:

    #import "Animal.h"

    @implementation Animal

    - (void)eat

    {

        NSLog(@"动物吃东西了");

    }

    @end



    /// Cat.h:

    #import "Animal.h"

    @interface Cat : Animal

    @end

    /// Cat.m:

    #import "Cat.h"

    @implementation Cat

    - (void)eat

    {

        NSLog(@"猫吃鱼");

    }

    @end


    /// Dog.h:

    #import "Animal.h"

    @interface Dog : Animal

    @end

    /// Dog.m:

    #import "Dog.h"

    @implementation Dog

    - (void)eat

    {

        NSLog(@"狗吃骨头");

    }

     

    @end


    // 外部使用

    Animal *animal = nil;

    animal = [[Cat allocinit];

    [animal eat];

    animal = [[Dog allocinit];

    [animal eat];


    // 输出如下:

    猫吃鱼

     

    狗吃骨头


    说明:

    a. 初始化方法返回的是id类型,id是一个可以指向任何对象的指针。因此animal可以指向Cat和Dog类型的对象。

    b. Cat类型对象和Dog类型对象在响应同一个方法eat中,做出了不同的反响,这正是多态的表现。

  3. 多态的特点:
    a. 父类指针可以指向不同的子类对象
    b. 允许在多个类中定义同一个消息接口
    c. 可以屏蔽不同的子类之间的差异,可以通用代码
    d. 适应需求的不同变化
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值