美文网首页
【开发技巧】利用IOP编程,在继承中,子类重载父类方法,但是又不

【开发技巧】利用IOP编程,在继承中,子类重载父类方法,但是又不

作者: 小子爱搞事 | 来源:发表于2017-02-16 13:59 被阅读115次

    来源:

    iOS应用架构谈 网络层设计方案

    思路:

    简单说就是在init的时候检查自己是否符合预先设计的子类的protocol,这就要求所有子类必须遵守这个protocol,所有针对父类的重载、覆盖也都以这个protocol为准,protocol以外的方法不允许重载、覆盖。而在父类的代码里,可以不必遵守这个protocol,保持了未来维护的灵活性。

    好处:

    就是避免了父类写空方法,同时也给子类带上了紧箍咒:要想当我的孩子,就要遵守这些规矩,不能乱来。业务方在实现子类的时候,就可以根据protocol中的方法去一一实现,然后约定就比较好做了:不允许重载父类方法,只允许选择实现或不实现protocol中的方法。


    比如父类:BaseApiManeger 子类:ApiManager,ApiTestManager

    在父类中的声明协议 SuperMethodProtocol ,在 SuperMethodProtocol 中声明需要重写的方法,指定为 @required@optional

    #import <Foundation/Foundation.h>
    
    @protocol SuperMethodProtocol <NSObject>
    
    @required
    
    - (void)apiMethod;
    
    @optional
    
    - (void)chiledMethod;
    
    @end
    
    
    @interface BaseApiManeger : NSObject
    
    // 声明 child 的属性,用于父类中调用子类中重载的方法
    @property (nonatomic, weak) id<SuperMethodProtocol> child;
    
    @end
    
    父类 .m 文件实现
    #import "BaseApiManeger.h"
    
    @implementation BaseApiManeger
    
    - (instancetype)init{
        self = [super init];
        if (self) {
            
            if ([self conformsToProtocol:@protocol(SuperMethodProtocol)]) {
                self.child = (id<SuperMethodProtocol>)self;
            }
            else{
                NSAssert(NO, @"子类必须实现 SuperMethodProtocol ");
            }
        }
        return self;
    }
    
    /** 父类中调用子类中的方法 */
    - (void)test{
        [self.child apiMethod];
    }
    @end
    
    子类实现
    #import "BaseApiManeger.h"
    // 遵守协议
    @interface ApiManager : BaseApiManeger<SuperMethodProtocol>
    
    @end
    
    @implementation ApiManager
    // 实现协议中的方法 -- 重载
    - (void)apiMethod{
        ...
    }
    
    - (void)chiledMethod{
        ...
    }
    @end
    

    如果子类没有遵守协议,则会报错

    *** Assertion failure in -[ApiTestManager init], /Users/yons/Desktop/继承重载/继承重载/BaseApiManeger.m:21
    

    相关文章

      网友评论

          本文标题:【开发技巧】利用IOP编程,在继承中,子类重载父类方法,但是又不

          本文链接:https://www.haomeiwen.com/subject/zhxhwttx.html