• OC继承


    1、成员访问类型

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

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

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

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

    2、重写(继承的另一部分)

    子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法,叫做重写。

    重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

     1 //父类声明文件
     2 #import <Foundation/Foundation.h>
     3 @interface Father : NSObject
     4 -(void)run;
     5 -(void)jump;
     6 @end
     7 
     8 //父类实现文件
     9 #import "Father.h"
    10 @implementation Father
    11 -(void)run{
    12     NSLog(@"he is running!");
    13     return;
    14 }
    15 -(void)jump{
    16     NSLog(@"father can jump 1.2m");
    17 }
    18 @end
     1 //子类声明文件
     2 #import "Father.h"
     3 
     4 @interface Son : Father
     5 
     6 @end
     7 
     8 //子类实现文件
     9 #import "Son.h"
    10 
    11 @implementation Son
    12 -(void)jump{
    13      NSLog(@"he can jump 0.6m");
    14 }
    15 @end

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

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

    继承的好处:

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

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

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

    3、虚方法

    OC的方法都是虚方法

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

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

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

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

    动物的父类声明与实现

    1 //动物类声明
    2 #import <Foundation/Foundation.h>
    3 @interface Animal : NSObject
    4 -(void)beBeaten;
    5 @end
    1 //动物类实现
    2 #import "Animal.h"
    3 @implementation Animal
    4 -(void)beBeaten{
    5     return;      //该方法需要子类实现,所以父类不需要写任何实现代码
    6 }
    7 @end

    子类(狗)的声明与实现

    1 #import "Animal.h"
    2 
    3 @interface Dog : Animal
    4 
    5 @end
    1 #import "Dog.h"
    2 
    3 @implementation Dog
    4 //该方法在父类已经声明,所以子类不需要重复声明
    5 -(void)beBeaten{
    6     NSLog(@"wang,wang...");
    7 }
    8 @end

    子类(猫)的声明与实现

    1 #import "Animal.h"
    2 
    3 @interface Cat : Animal
    4 
    5 @end
    1 #import "Cat.h"
    2 
    3 @implementation Cat
    4 //该方法在父类已经声明,所以子类不需要重复声明
    5 -(void)beBeaten{
    6 NSLog(@"miao,miao...");
    7 }
    8 @end

    人类的声明与实现

    1 #import <Foundation/Foundation.h>
    2 #import "Animal.h"
    3 @interface Human : NSObject
    4 //调用该方法,此处只写一个父类的指针就可以,这是利用了父类的虚方法;
    5 //不然,需要写多个方法实现:beatAnimal:(Dog *)dog;beatAnimal:(Cat *)cat;打不同的动物需要传不同的对象,所以利用虚方法、父类的指针是非常方便的
    6 -(void)beatAnimal:(Animal*)animal;
    7 @end
    1 #import "Human.h"
    2 
    3 @implementation Human
    4 -(void)beatAnimal:(id)animal{
    5     NSLog(@"Human beat the %@",[animal class]);
    6     [animal beBeaten];
    7 }
    8 @end
     1 Dog * dog = [[Dog alloc] init];
     2 Cat * cat = [[Cat alloc] init];
     3 Human * xiaoming = [[Human alloc] init];
     4 [xiaoming beatAnimal:dog];
     5 [xiaoming beatAnimal:cat];
     6 //输出:
     7 //2013-09-29 15:51:00.604 OC[752:303] Human beat the Dog
     8 //2013-09-29 15:51:00.619 OC[752:303] wang,wang...
     9 //2013-09-29 15:51:00.620 OC[752:303] Human beat the Cat
    10 //2013-09-29 15:51:00.621 OC[752:303] miao,miao...

    结题!!!

  • 相关阅读:
    字符串逆序输出
    格式化输出
    redis的使用
    redis介绍
    虚拟机间的网络配置+远程访问数据库
    django之contenttype组件
    http请求
    cookie和session
    Django视图解决csrftoken认证
    Django视图解析
  • 原文地址:https://www.cnblogs.com/GISerYang/p/3345982.html
Copyright © 2020-2023  润新知