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

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

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

首先做几个实验验证:

提供的源码如下:

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

为什么要这么做呢?

其实,这就是软件设计中的不破坏原始接口的用处哦:),需要自己去慢慢体会.

解决重写父类的方法且不会影响继承的子类的问题相关推荐

  1. 【暑假学习笔记】之——用Intellij idea新建一个java web+Servlet项目(有实例)——idea中快速重写父类的方法

    Intellij idea中快速重写父类方法 在写java文件时,有时候需要重写父类方法,但在idea中创建java文件时并不会像eclipse一样可以选择父类,但是重写父类方法其实只需要这样做: 鼠 ...

  2. java 子类重写父类的方法应注意的问题

    若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:     重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写 ...

  3. java重载与重写的区别+重写父类equals方法的完美实现

    [0]README 0.1) 本文章节[1]和[2]的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html : 旨 ...

  4. java 子类重写父类的方法的注意事项

    2019独角兽企业重金招聘Python工程师标准>>> 若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:重写方法不能比被重写方法限制有更严格的访 ...

  5. 继承一定要重写父类的方法吗

    分为两种情况. 父类方法为抽象方法,必须重写. 父类方法为普通方法,可以重写也可以不重写.

  6. Scala重写父类普通方法

  7. java子类可以修改父类成员吗_子类重写父类成员方法

    最近在学习到Java的继承和多态时遇到了这样的一个问题:关于继承链中子类对父类的私有方法是否可以覆盖的问题,在此记录一下自己对这个问题解决以后的一些心得. 首先要明确:子类是不能够覆盖(重写)父类的私 ...

  8. java 重写方法 访问权限_为何Java中子类重写方法的访问权限不能低于父类中权限(内含里氏替换原则)...

    为何Java中子类重写方法的访问权限不能低于父类中权限 因为 向上转型及Java程序设计维护的原因 例: 假设一个父类A 拥有的方法public void setXXX(){}可以被其他任意对象调用这 ...

  9. Python 重写父类方法

    python继承中,如果子类在调用某个方法时,它首先是从派生类(也就是当前类)中去找对应的方法,如果当前类中找不到对应的方法,就会去基类(派生类)中去逐个查找. 若父类的方法不能满足子类的需要,那么子 ...

最新文章

  1. Java中实现接口与继承的区别
  2. Java生成xlsx格式的excel文件
  3. CentOS 6.5 部署 Horizon
  4. Spring Cloud构建微服务架构(一)服务注册与发现
  5. 微信小程序 map 点击图标回到自己的位置(不使用controls控件)
  6. x86汇编-2(第五章)nasm汇编基础知识、指令、显存、bochs调试
  7. 使用命令行导出 SQL Server 数据层应用程序
  8. java如何实现乌龟爬行_请教:一只乌龟的运动
  9. 教你用 FRP 自建 Teamview 连接避开商业检测
  10. ios 去掉底部状态栏,隐藏ios 9中的状态栏
  11. Google 开源机器学习数据集可视化工具 Facets
  12. 网页编码_Python获取网页编码(apparent_encoding)
  13. STC 18B20温度传感器读写程序
  14. 微信小程序图片转换成文字_涨知识!这个微信小程序,能将纸上文字转换成电子版...
  15. leetcode 刷题录
  16. dwz jui 修改html元素,js框架 dwz jui 的日历组件 添加自定义事件
  17. Win10-更改c盘下的用户文件夹名
  18. FPGA SDRAM接口设计(一)初窥门径
  19. 二十六、多线程练习题
  20. 如何在Ubuntu 20.04上安装和使用TimescaleDB

热门文章

  1. python 珠玑妙算
  2. pyqt5教程9:Widgets组件
  3. Python概念:生成唯一性序号uuid
  4. 2021-03-04 Halcon初学者知识 【18】谈谈秩滤波(Rank filter)
  5. c语言编写的程序停止运行程序,C语言中,编译成功但运行停止的几个原因
  6. 【新星计划】MATLAB-多项式计算
  7. 2021-04-05 Python tqdm显示代码任务进度
  8. solaris与linux区别,solaris与linux命令的区别
  9. python语法错误常见原因_python3中open()的语法错误,不知道原因
  10. JAVA 判断其是否为合法标识符