码迷,mamicode.com
首页 > 其他好文 > 详细

重写父类的方法且不会影响继承的子类---【解决此问题】

时间:2014-09-19 19:03:25      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   strong   2014   div   

基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口.

但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:)

首先做几个实验验证:

提供的源码如下:

LAObject类  LBObject类  LCobjet类  (LBObject类继承于LAObject类,LCobjet类继承于LBObject类)

//  LAObject.h
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface LAObject : NSObject


-(void)info;
@end
//  LAObject.m
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import "LAObject.h"

@implementation LAObject

-(void)info
{
    NSLog(@"message----- A---+++---");
}

 

//  LBObject.h
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import "LAObject.h"

@interface LBObject : LAObject

@end
//  LBObject.m
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import "LBObject.h"

@implementation LBObject


-(void)info
{
    [super info];
    NSLog(@"message-----B---+++---");
}

 

//  LCobjet.h
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "LBObject.h"

@interface LCobjet : LBObject

@end
//  LCobjet.m
//  AesAndDesTest1.0
//  Copyright (c) 2014年 Lisa. All rights reserved.
//

#import "LCobjet.h"

@implementation LCobjet


-(void)info
{
    [super info];
    NSLog(@"message-----C---+++---");
}


@end

测试代码

   LAObject *a =[LAObject new];
    LBObject *b =[LBObject new];
    LCobjet *c =[LCobjet new];
    [a info];
    NSLog(@"----+++++---%@",a);
    [b info];
    NSLog(@"----+++++---%@",b);

    [c info];
    NSLog(@"----+++++---%@",c);

 打印结果:

2014-09-19 16:42:54.834 AesAndDesTest1.0[5921:907] message----- A---+++-<LAObject: 0x75a0ec0>--

2014-09-19 16:42:54.836 AesAndDesTest1.0[5921:907] ----+++++---<LAObject: 0x75a0ec0>

2014-09-19 16:42:54.836 AesAndDesTest1.0[5921:907] message----- A---+++-<LBObject: 0x75a0f70>--

2014-09-19 16:42:54.837 AesAndDesTest1.0[5921:907] message----- B---+++-<LBObject: 0x75a0f70>--

2014-09-19 16:42:54.837 AesAndDesTest1.0[5921:907] ----+++++---<LBObject: 0x75a0f70>

2014-09-19 16:42:54.838 AesAndDesTest1.0[5921:907] message----- A---+++-<LCobjet: 0x75a0fc0>--

2014-09-19 16:42:54.838 AesAndDesTest1.0[5921:907] message----- B---+++-<LCobjet: 0x75a0fc0>--

2014-09-19 16:42:54.839 AesAndDesTest1.0[5921:907] message----- C---+++-<LCobjet: 0x75a0fc0>--

2014-09-19 16:42:54.839 AesAndDesTest1.0[5921:907] ----+++++---<LCobjet: 0x75a0fc0>

为什么LCobjet会执行三次?原因看下图

bubuko.com,布布扣 

因为,重写了父类的方法时是需要先调用父类方法的,毕竟,有时候,父类的方法进行了一些配置,子类才能用,所有,通过 super 调用了父类的方法,一级一级到达了基类A了.

我们要达到什么样的效果呢?

我们需要达到的效果是:不让子类LCObject不会调用LAObject类与LBObject类的打印语句

修改成如下形式:

bubuko.com,布布扣

打印结果:

2014-09-19 16:57:31.520 AesAndDesTest1.0[6026:907] message----- A---+++-<LAObject: 0x759f310>--

2014-09-19 16:57:31.522 AesAndDesTest1.0[6026:907] ----+++++---<LAObject: 0x759f310>

2014-09-19 16:57:31.523 AesAndDesTest1.0[6026:907] message----- B---+++-<LBObject: 0x759f050>--

2014-09-19 16:57:31.523 AesAndDesTest1.0[6026:907] ----+++++---<LBObject: 0x759f050>

2014-09-19 16:57:31.524 AesAndDesTest1.0[6026:907] message----- C---+++-<LCobjet: 0x759f360>--

2014-09-19 16:57:31.524 AesAndDesTest1.0[6026:907] ----+++++---<LCobjet: 0x759f360>

这样做的目的:

这就是软件设计中的不破坏原始接口的用处哦:)

重写父类的方法且不会影响继承的子类---【解决此问题】

标签:des   style   blog   http   color   io   strong   2014   div   

原文地址:http://www.cnblogs.com/lisaloveyou1900/p/3981874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!