继承

    假设现在有两个类,分别是教师类与学生类,定义如下:

    1. @interface Student : NSObject {
    2. NSString *_name;
    3. NSInteger _age;
    4. float _height;
    5. float _score;
    6. }
    7. @end

    不难看出,学生类与教师类都有姓名、年龄与身高。那么,可不可以想一个办法,把这些都有的成员提取(抽象)出来,作为一个类,然后让学生和教师都引入就行了呢?答案是,可以的,使用继承就行。

    1. 对于StudentTeacher两个类来说,首先要找到共有的部分(即姓名、年龄、身高);
    2. 然后他们都是属于人类的;
    3. 那么我们就可以抽象出一个人类,然后让TeacherStudent来继承它。

    首先,人类的定义:

    1. #import <Foundation/Foundation.h>
    2. @interface Person : NSObject {
    3. NSString *_name;
    4. NSInteger _age;
    5. float _height;
    6. @end

    然后,学生有自己独有的成员变量,叫做_score,写法如下:

    1. #import "Person.h"
    2. // 注意:继承关系变成了Teacher继承自Person
    3. @interface Teacher : Person {
    4. float _salary;
    5. }
    6. @end

    与上面使用继承的原因相同,对于人类来说,有自己的初始化方法,比如直接自定义init方法来初始化成员变量,Person类中的定义与实现如下:

    1. #import <Foundation/Foundation.h>
    2. @interface Person : NSObject {
    3. NSString *_name;
    4. NSInteger _age;
    5. float _height;
    6. }
    7. - (instancetype)initWithName:(NSString *)name age:(NSInteger)age height:(float)height;
    8. @end

    同样,因为StudentTeacher继承自Person,所以他们也可以直接调用自定义init方法来进行对象的初始化。

    1. #import <Foundation/Foundation.h>
    2. #import "Person.h"
    3. #import "Student.h"
    4. int main(int argc, const char * argv[]) {
    5. @autoreleasepool {
    6. // insert code here...
    7. Person *person = [[Person alloc] initWithName:@"A" age:0 height:10];
    8. Teacher *teacher = [[Teacher alloc] initWithName:@"B" age:3 height:12];
    9. Student *student = [[Student alloc] initWithName:@"C" age:5 height:16];
    10. }
    11. return 0;
    12. }

    常用的访问权限修饰符有:@public@private,区别如下:

    1. #import <Foundation/Foundation.h>
    2. @interface Person : NSObject {
    3. // 表示_name与_age两个成员变量是公开的,任何地方都可以访问
    4. @public
    5. NSString *_name;
    6. NSInteger _age;
    7. // 表示_height成员变量是私有的,只有自己访问,不能被继承
    8. @private
    9. float _height;
    10. }
    11. @end
    1. OC中的继承为单继承,也就是说,一个子类,只能有一个父类;