首页 > 代码库 > 重写父类的方法且不会影响继承的子类---【解决此问题】
重写父类的方法且不会影响继承的子类---【解决此问题】
基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口.
但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:)
首先做几个实验验证:
提供的源码如下:
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会执行三次?原因看下图
因为,重写了父类的方法时是需要先调用父类方法的,毕竟,有时候,父类的方法进行了一些配置,子类才能用,所有,通过 super 调用了父类的方法,一级一级到达了基类A了.
我们要达到什么样的效果呢?
我们需要达到的效果是:不让子类LCObject不会调用LAObject类与LBObject类的打印语句
修改成如下形式:
打印结果:
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>
这样做的目的:
这就是软件设计中的不破坏原始接口的用处哦:)
重写父类的方法且不会影响继承的子类---【解决此问题】