您好,欢迎访问代码之道!登录后台查看权限
  • 欢迎大神光临
  • 有朋自远方来 不亦悦乎

Objective-C教程之类继承和重写

ObjC教程 老刘 2018-08-13 817 次浏览 0个评论

继承,既让子类(派生类直接拥有父类的功能)。下面我们看一下Objective中类继承关系中的特点。 + 访问控制:派生类可以直接访问基类声明在接口中的成员变量,但是不能访问实现中的变量; 派生生类可以直接访问基类声明在接口中的方法,但是不能访问实现中的方法;

  • 重写:子类可以重写父类的类方法(+方法)和实列方法(-方法),直接在子类实现中重写就可以了;

  • 子类访问父类方法:如果在类里面,父类方法被重写了,但是还是想访问父类的方法,可以通过[super 父类方法]访问父类的方法。

  • 转型:子类可以赋值给父类变量(向上转型;父类也可以赋值给子类变量(向下转型),但是需要添加类型强转,转换为父类后,访问的方法如果被 重写,那么调用的还是子类重写的方法,而不是父类的方法。程序员自己把握转型其中的风险, 一般来说向上转型是安全的,只是会无法直接访问子类所特有的方法和属性,向下转型一般来说是不安全的。

下面还是看个例子来加深体会

#include <Foundation/Foundation.h>

@interface MSPerson : NSObject {
    NSString *name_;
}

- (void)setName:(NSString *)newName;

- (void)printDoing;
@end

@implementation  MSPerson

- (void)setName:(NSString *)newName {
    name_ = newName;
}

- (NSString *)name {
    return name_;
}

- (void)printDoing {
    NSLog(@"%@在睡觉", name_);
}
@end

@interface MSSinger : MSPerson
@end

@implementation  MSSinger
// 重写父类的方法
- (void)printDoing {
    // 注:如果name放到MSPerson的实现中,将不可以直接访问,只能通过name方法访问。
    NSLog(@"%@在唱歌", name_);
    // 通过super关键字访问父类方法
    // [super printDoing];
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 子类可以直接赋值给父类变量
        MSPerson *p1 = [[MSSinger alloc] init];
        p1.name = @"jack";
        [p1 printDoing];
    }

    return 0;
}

/*
程序输出:
2018-08-13 18:05:43.697 inheritance[6705:169570] jack在唱歌
 * */

已有 817 位网友参与,快来吐槽:

发表评论