zoukankan      html  css  js  c++  java
  • Object C学习笔记23-继承,重写,重载

      前面的学习都一直在使用Object C对象,但是没有具体总结过Object C中的对象使用特性,这里简单总结一下。

      一.  继承

        在面向对象编程中,子类可以通过继承得到父类的可以继承的的属性和方法,在Object C中也同样如此。

        先定义一个Person类,并且定义几个属性和一个方法:

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        NSString *name;
        int age;
        NSArray *itmes;
    }
    @property (nonatomic,retain) NSString *name;
    @property (nonatomic,assign) int age;
    @property (nonatomic,retain) NSArray *itmes;
    
    -(void) write;
    @end
    Person类的定义

        在上面的代码中,Person类定义了三个属性name,age,items,对应的类型分别为NSString,int,NSArray. 其中还有一个方法write,返回值类型为void,没有输入参数。其具体描述内容如下:

    #import "Person.h"
    
    @implementation Person
    
    @synthesize name;
    @synthesize age;
    @synthesize itmes;
    
    -(void) write{
        NSLog(@"%d",self.age);
        NSLog(@"Person 对象调用write方法");
    }
    
    @end
    Person类

        在write方法中我们可以看到输出了age,并且输出一个字符串,这里又来标识具体调用哪个方法。

        再顶一个Student类,继承Person类,在Person类中定义一个属性address,为NSString类型,并且定义一个方法eat,返回值类型为void,没有输入参数,具体的代码如下:

    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    @interface Student : Person{
        NSString *address;
    }
    @property (nonatomic,retain) NSString *address;
    
    -(void) eat;
    
    @end
    
    -------------------------------------------------------------------
    #import "Student.h"
    
    @implementation Student
    @synthesize address;
    
    -(void) eat{
        NSLog(@"Student 调用eat方法");
    
    }
    
    @end
    Student类

        通过如上代码,Student就继承了Person类的属性和方法。

    Person *person=[[Person alloc] init];
            person.age=43;
            [person write];
            Student *student=[[Student alloc] init];
            student.address=@"上海";
            student.age=99;
            [student eat];
            [student write];
    测试代码

        输出如下结果:

    2014-04-05 13:25:30.990 ObjectCApress[1659:303] 43
    2014-04-05 13:25:30.992 ObjectCApress[1659:303] Person 对象调用write方法
    2014-04-05 13:25:30.993 ObjectCApress[1659:303] Student 调用eat方法
    2014-04-05 13:25:30.994 ObjectCApress[1659:303] 99
    2014-04-05 13:25:30.995 ObjectCApress[1659:303] Person 对象调用write方法

        通过以上代码我们可以看出,Student继承了父类Person的属性和方法。

      二. 重写

        在调用对象继承方法的时候,调用和执行的是基类的实现.但是,有时需要对派生类中的继承方法有不同的实现.这个时候我们就需要重写父类方法,但是在Object C中重写和.NET中的重写有点区别,不需要使用特殊的关键字标识。

        在Object C重写父类方法,只需要重新实现该方法即可,代码如下:

    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    @interface Student : Person{
        NSString *address;
    }
    @property (nonatomic,retain) NSString *address;
    
    -(void) eat;
    
    @end
    
    -------------------------------------------------
    #import "Student.h"
    
    @implementation Student
    @synthesize address;
    
    -(void) eat{
        NSLog(@"Student 调用eat方法");
    
    }
    
    -(void) write{
        NSLog(@"调用Student的Write方法");
    }
    
    @end
    重写父类方法

        在上面的代码中看出Student.m类中有一个write方法,其就是重写父类方法,不需要使用任何其他的修饰符。在上面的代码我们测试得到如果student类调用write 方法,其实是调用父类的方法,这里Student再调用write方法看看:

    Student *student=[[Student alloc] init];
            student.address=@"上海";
            student.age=99;
            [student eat];
            [student write];

        输出结果如下:

    2014-04-05 13:36:21.055 ObjectCApress[1698:303] Student 调用eat方法
    2014-04-05 13:36:21.058 ObjectCApress[1698:303] 调用Student的Write方法

        结果输出"调用Student的write方法",说明这里不是调用的父类方法了

      三. 在子类调用父类方法

        在.NET中我们可以使用super关键字来调用,在在Object C中也可以使用super 来调用父类的方法。

    -(void) write{
        NSLog(@"调用Student的Write方法");
        [super write];
    }

        修改Student.m中的write方法,在这个方法中添加[super write] 语句用来调用父类的write方法。输出结果如下:

    2014-04-05 15:14:28.164 ObjectCApress[1815:303] Student 调用eat方法

    2014-04-05 15:14:28.167 ObjectCApress[1815:303] 调用StudentWrite方法

    2014-04-05 15:14:28.168 ObjectCApress[1815:303] 99

    2014-04-05 15:14:28.168 ObjectCApress[1815:303] Person 对象调用write方法

        同样使用以上代码来测试,得到如上输出的结果,从结果中我们可以看得出,使用super调用了父类方法。

      四. 重载

        .NET中重载就是方法名相同而输入参数不一样,在Object C中并没有重载。

    -(void) eat;
    -(void) eat(int a);

        我们尝试使用.NET的那种方式重载方法,如上代码,使用编译器编译报错,因为Object C中不支持方法的重载。

  • 相关阅读:
    无所不能的Ant 【转】
    fstream的文件操作
    dos下的for命令详解(zz)
    c++中vector的用法总结
    学习Git上
    IE下的document.onclick问题
    第一次面试实习感触
    大数据概述
    红旗
    词法分析
  • 原文地址:https://www.cnblogs.com/qingyuan/p/3647112.html
Copyright © 2011-2022 走看看