SubClasing用法--子类重写父类方法,父类直接调用实现方式

subclasing 浅谈 --  父类和子类之间进行消息传递的一种实现

继承:一个派生类可以从一个基类派生,这个派生类就是子类,当子类继承父类之后,可以重写父类的方法或者直接调用父类的方法,即子类拥有父类的所有功能并且可以进行功能的扩展,我们通过继承可以实现低耦合和程序接口的统一,让程序复用性更高


多态:多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。


考虑:C++中有多继承和虚函数,可以实现父类调用子类的方法---通过子类创建实例,父类定义接口,让子类的实例强转父类调用接口即可实现父类调用子类的方法,OC中没有虚函数,那如何实现这种方式呢?


探究:OC中有没有实现这种方式的写法呢? 答案是肯定的,OC中实现多态是通过采用(subclassing)这种方式实现的


实现:【先考虑基类是单利时候】

第一步:先定义基类即super class,在定义接口的时候,需要指出哪些是子类可以重写并可以有父类调用的,父类.h 实现接口如下:

#import <Foundation/Foundation.h>

/************************super class interface***********************/

@interface SuperClass : NSObject

+ (id)sharedReporter;

- (void)showSubData;

- (void)subComeBack;

@end

/************************sub class interface***********************/
@interface SuperClass (subclasing)

- (id)initShareSubclass;

- (void)sendSuperData:(NSString *)str;

@end

注:此时在.m 中可以任意调用和实现subclsing所定义的接口方法,当没有子类继承的时候,就调用这些方法,如果有子类调用并重写了这些方法,此时会调用子类的,父类的方法将被覆盖


第二步:实现方法,先实现share的方法,重点是在share创建中去调用subclasing中定义的init类实现当创实例对象

@interface SuperClass()

@property (nonatomic,assign) int classtag;

@end

@implementation SuperClass

+ (id)sharedReporter
{
    static dispatch_once_t __sharedToken = 0;
    static SuperClass * sharedSuper = nil;
    dispatch_once(&__sharedToken, ^{
        sharedSuper = [[self alloc] initShareSubclass];
    });
    return sharedSuper;
}

- (void)showSubData
{
    NSString *str = @"superData";
    [self sendSuperData:str]; //调用子类方法,如果有子类,就会调用子类的方法,因为接口部分已经跟定了这个是子类实现的,
    NSLog(@"");
}

- (void)subComeBack
{
    NSLog(@"子类回调方法");
}

//子类的 init,在创建父类的时候做子类的创建,实现父类 调用子类的方法
- (id)initShareSubclass
{
    if (self = [super init]) {
        
    }
    return self;
}

- (void)sendSuperData:(NSString *)str
{
    NSLog(@"子类运行这个方法~");
    [self subComeBack];
}

@end

注:如果没有子类的重写

@interface SuperClass (subclasing)

- (id)initShareSubclass;

- (void)sendSuperData:(NSString *)str;

@end

这两个方法,那父类实例对象调用的就是本类中实现的方法。


第三步:继承基类,重写基类Subclasing中的方法,当然子类继承父类,可以直接super 父类中的.h 上定义的所有方法

#import "SuperClass.h"

@interface SubClass :SuperClass

@end

#import "SubClass.h"

@implementation SubClass

//重写父类方法
- (void)sendSuperData:(NSString *)str
{
    NSLog(@"str SUB = %@",str);
    //调用父类方法
    [super subComeBack];
}

@end

注:此时, SuperClass *sub = [ SuperClass sharedReporter]; [sub showSubData]; 调用的时候,父类就实现了调用子类的方法,实现子类重写父类方法,让父类去调用


用途:当你封装了一个类,这个类是高度定义的基类,但是基类需要实现多种类型的功能【多态】,就需要这种方式来实现多态。


扩展:上例按照单利写的,便于理解,如果不是单利,在实现的时候,就需要实例化子类,然后强转成父类,利用父类的指针来去调用几口,实现对子类方法的抵用。


总结:这个是实现封装和多态的一种方式,是一种高内聚,低耦合的一种实现方式,如果要加深这种写法,不防看看C++中的虚函数吧~



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值