iOS基础(oc)-继承

----- 知之博客 期待与您交流! -------

一 成员访问类型

    private:私有成员,不能被外部函数访问(使用),也不能被子类继承;

    protected:保护成员,不能被外部函数访问,可以被子类继承;

    public:公有成员,可以被外部函数访问,也可以被子类继承。

                  OC中,所有的方法(消息),都是公有的。


二 重写(继承的另一部分)

    重写:子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法。重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

//父类声明文件
#import <Foundation/Foundation.h>
@interface Father : NSObject
-(void)run;
-(void)jump;
@end
//父类实现文件
#import "Father.h"
@implementation Father
-(void)run{
    NSLog(@"he is running!");
    return;
}
-(void)jump{
    NSLog(@"father can jump 1.2m");
}
@end
//子类声明文件
#import "Father.h"
@interface Son : Father
@end
//子类实现文件
#import "Son.h"
@implementation Son
-(void)jump{
     NSLog(@"he can jump 0.6m");
}
@end

    子类重写父类的jump方法,不需要重新声明。

    同一个方法,不同的实现,称为多态。重写是多态的一种。

    继承的好处

  1)创建大量的相似类的时候,可以节省工作量。

  2)使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

    注意:NSString、NSArray、NSDictionary都是不能够继承的。

    3、虚方法

    OC的方法都是虚方法

  1)父类的指针可以指向子类的对象

    Son * son = [[Son alloc] init];
    Father * p = son;

        上面p和son都指向子类的对象;调用方法时,不看指针,看对象,对象的地址指向什么对象,就调用什么方法,称为虚方法。

  2)调用方法时,不看指针看对象,这样的方法叫做虚方法。虚方法的好处:可以描述不同事物被相同事件触发,产生不同的响应(结果)。体会下面的例子

    动物的父类声明与实现

  //动物类声明
  #import <Foundation/Foundation.h>
  @interface Animal : NSObject
  -(void)beBeaten;
  @end

  //动物类实现
  #import "Animal.h"
  @implementation Animal
  -(void)beBeaten{
    return;      //该方法需要子类实现,所以父类不需要写任何实现代码
  }
  @end

    子类(狗)的声明与实现

  #import "Animal.h" 
  @interface Dog : Animal
  @end

  #import "Dog.h"
  @implementation Dog
  //该方法在父类已经声明,所以子类不需要重复声明
  -(void)beBeaten{
   NSLog(@"wang,wang...");
  }
  @end

    子类(猫)的声明与实现

  #import "Animal.h"
  @interface Cat : Animal
  @end

  #import "Cat.h"
  @implementation Cat
  //该方法在父类已经声明,所以子类不需要重复声明
  -(void)beBeaten{
  NSLog(@"miao,miao...");
  }
  @end
    人类的声明与实现

  #import <Foundation/Foundation.h>
  #import "Animal.h"
  @interface Human : NSObject
  //调用该方法,此处只写一个父类的指针就可以,这是利用了父类的虚方法;
  //不然,需要写多个方法实现:beatAnimal:(Dog *)dog;beatAnimal:(Cat *)cat;打不同的动物需要传不同的对象,所以利用虚方法、父类的指针是非常方便的
  -(void)beatAnimal:(Animal*)animal;
  @end

  #import "Human.h" 
  @implementation Human
  -(void)beatAnimal:(id)animal{
   NSLog(@"Human beat the %@",[animal class]);
  [animal beBeaten];
  }
  @end

  Dog * dog = [[Dog alloc] init];
  Cat * cat = [[Cat alloc] init];
  Human * xiaoming = [[Human alloc] init];
  [xiaoming beatAnimal:dog];
  [xiaoming beatAnimal:cat];
  //输出:
  //2013-09-29 15:51:00.604 OC[752:303] Human beat the Dog
  //2013-09-29 15:51:00.619 OC[752:303] wang,wang...
  //2013-09-29 15:51:00.620 OC[752:303] Human beat the Cat
  //2013-09-29 15:51:00.621 OC[752:303] miao,miao...



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值