解决重写父类的方法且不会影响继承的子类的问题
解决重写父类的方法且不会影响继承的子类的问题
基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口.
但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:)
首先做几个实验验证:
提供的源码如下:
A类 B类 C类 (B类继承于A类,C类继承于B类)
// // A.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import <Foundation/Foundation.h>@interface A : NSObject- (void)info;@end
// // A.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "A.h"@implementation A- (void)info {NSLog(@"%@ message:%@", self, @"A"); }@end
// // B.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "A.h"@interface B : A- (void)info;@end
// // B.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "B.h"@implementation B- (void)info {[super info];NSLog(@"%@ message:%@", self, @"B"); }@end
// // C.h // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "B.h"@interface C : B- (void)info;@end
// // C.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "C.h"@implementation C- (void)info {[super info];NSLog(@"%@ message:%@", self, @"C"); }@end
测试的源码如下:
// // RootViewController.m // Super // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import "A.h" #import "B.h" #import "C.h"@interface RootViewController ()@end@implementation RootViewController- (void)viewDidLoad {[super viewDidLoad];A *a = [A new];B *b = [B new];C *c = [C new];[a info];NSLog(@"\n===========\n");[b info];NSLog(@"\n===========\n");[c info]; }@end
打印结果:
2014-08-16 09:48:13.556 Super[23845:60b] <A: 0xa142620> message:A
2014-08-16 09:48:13.557 Super[23845:60b]
===========
2014-08-16 09:48:13.557 Super[23845:60b] <B: 0xa142f00> message:A
2014-08-16 09:48:13.557 Super[23845:60b] <B: 0xa142f00> message:B
2014-08-16 09:48:13.558 Super[23845:60b]
===========
2014-08-16 09:48:13.558 Super[23845:60b] <C: 0xa142fd0> message:A
2014-08-16 09:48:13.558 Super[23845:60b] <C: 0xa142fd0> message:B
2014-08-16 09:48:13.559 Super[23845:60b] <C: 0xa142fd0> message:C
为什么C对象会执行了3次呢?请看下图:
因为,重写了父类的方法时是需要先调用父类方法的,毕竟,有时候,父类的方法进行了一些配置,子类才能用,所有,通过 super 调用了父类的方法,一级一级到达了基类A了.
我们要达到什么样的效果呢?
我们需要达到的效果是:让子类C不会调用A类与B类的打印语句
修改成如下形式:
打印结果:
2014-08-16 10:07:57.270 Super[23966:60b] <A: 0x8d17200> message:A
2014-08-16 10:07:57.272 Super[23966:60b]
===========
2014-08-16 10:07:57.272 Super[23966:60b] <B: 0x8d17aa0> message:B
2014-08-16 10:07:57.272 Super[23966:60b]
===========
2014-08-16 10:07:57.273 Super[23966:60b] <C: 0x8d17b70> message:C
为什么要这么做呢?
其实,这就是软件设计中的不破坏原始接口的用处哦:),需要自己去慢慢体会.
解决重写父类的方法且不会影响继承的子类的问题相关推荐
- 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法
Intellij idea中快速重写父类方法 在写java文件时,有时候需要重写父类方法,但在idea中创建java文件时并不会像eclipse一样可以选择父类,但是重写父类方法其实只需要这样做: 鼠 ...
- java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一: 重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写 ...
- java重载与重写的区别+重写父类equals方法的完美实现
[0]README 0.1) 本文章节[1]和[2]的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html : 旨 ...
- java 子类重写父类的方法的注意事项
2019独角兽企业重金招聘Python工程师标准>>> 若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:重写方法不能比被重写方法限制有更严格的访 ...
- 继承一定要重写父类的方法吗
分为两种情况. 父类方法为抽象方法,必须重写. 父类方法为普通方法,可以重写也可以不重写.
- Scala重写父类普通方法
- java子类可以修改父类成员吗_子类重写父类成员方法
最近在学习到Java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得. 首先要明确:子类是不能够覆盖(重写)父类的私 ...
- java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...
为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...
- Python 重写父类方法
python继承中,如果子类在调用某个方法时,它首先是从派生类(也就是当前类)中去找对应的方法,如果当前类中找不到对应的方法,就会去基类(派生类)中去逐个查找. 若父类的方法不能满足子类的需要,那么子 ...
最新文章
- Java中实现接口与继承的区别
- Java生成xlsx格式的excel文件
- CentOS 6.5 部署 Horizon
- Spring Cloud构建微服务架构(一)服务注册与发现
- 微信小程序 map 点击图标回到自己的位置(不使用controls控件)
- x86汇编-2(第五章)nasm汇编基础知识、指令、显存、bochs调试
- 使用命令行导出 SQL Server 数据层应用程序
- java如何实现乌龟爬行_请教:一只乌龟的运动
- 教你用 FRP 自建 Teamview 连接避开商业检测
- ios 去掉底部状态栏,隐藏ios 9中的状态栏
- Google 开源机器学习数据集可视化工具 Facets
- 网页编码_Python获取网页编码(apparent_encoding)
- STC 18B20温度传感器读写程序
- 微信小程序图片转换成文字_涨知识!这个微信小程序,能将纸上文字转换成电子版...
- leetcode 刷题录
- dwz jui 修改html元素,js框架 dwz jui 的日历组件 添加自定义事件
- Win10-更改c盘下的用户文件夹名
- FPGA SDRAM接口设计(一)初窥门径
- 二十六、多线程练习题
- 如何在Ubuntu 20.04上安装和使用TimescaleDB