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

  • Post author:
  • Post category:其他



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++中的虚函数吧~



版权声明:本文为luxiaobin1985原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。