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

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

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

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

首先做几个实验验证:

提供的源码如下:

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

 

为什么要这么做呢?

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

时间: 2025-01-20 18:58:16

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

多态-java中为什么会自动执行子类重写父类的方法?

问题描述 java中为什么会自动执行子类重写父类的方法? 问题: 1.在main方法中我没有调用paint方法,为什么它会自动被调用? 2.老师说这是多态,可是多态不是需要三个条件实现么?继承,重写方法,父类引用指向子类对象,这里没有第三点啊 代码如下: public class GameFrame extends Frame{ public void launchFrame(){ setSize(500,500); setLocation(100,100); setVisible(true);

用类的继承关系(重写父类的方法)实现简易后台代码模板_实用技巧

Asp.net的优势就在于快速构建应用,而对于一些最基础数据的增删改以及分页事件或者样式的设定可以通过在父类中写上虚方法来供子类调用,如果子类需要在模板的基础上衍生变化或者索性不要父类的方法的话,则只需要重写父类的方法即可. 实验代码如下: 首先是模板类的抽象,继承自Page类: 复制代码 代码如下: public class Template : System.Web.UI.Page { protected override void OnLoad(EventArgs e) { base.On

java-关于android子类重写父类方法,方法体里面的方法的问题

问题描述 关于android子类重写父类方法,方法体里面的方法的问题 android中子类重写父类Activity方法,在onCreate这个方法的方法体里面有个setContentView方法,这个方法是调用外部方法吗,为什么前面没加this关键词,不是说方法的方法体里面调用外部方法要加this关键词,加了没加有什么区别 解决方案 不是调用外部方法,这是调用父类Activity中的方法 解决方案二: 子类重写父类的方法应注意的问题java 子类重写父类的方法应注意的问题java 子类重写父类的

java-JAVA子类不能继承父类私有方法是么

问题描述 JAVA子类不能继承父类私有方法是么 父类都不能用他本身的私有方法,子类岂不是更不能用了,这一点是怎么证明的?举个例子 解决方案 父类本身的私有方法是可以被自己的其他方法调用的,但是这些私有方法子类是不能调用的,但是可能被间接调用. 例如下面的例子,父类的私有方法被一个公有方法调用了,那么子类继承这个公有方法后也就间接调用了父类的私有方法了.但是子类可直接访问的方法里却没有这个私有方法的. public class Parent { public void say(){ call();

PHP中子类重载父类的方法【parent::方法名】_php实例

在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写. 子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承过来不就可以直接使用吗?为什么还要重载呢?因为有一些情况我们必须要覆盖的.例如,有一个"鸟"类,在这个类中定义了鸟的通用方法"飞翔".将"鸵鸟"类作为它的子类,

java中如果一个类不是某个父类的子类,然后去调用父类的方法会报错吗

问题描述 java中如果一个类不是某个父类的子类,然后去调用父类的方法会报错吗 java中如果一个类不是某个父类的子类,然后去重写父类的方法会报错吗 比如 public Cxff { super.onCreate( )}有语法错误吗 解决方案 肯定会报错,举个不太恰当的例子,我爸的钱我可以随便花,陌生人要是想花就花,那不是要上天了? 解决方案二: 会报错的,它不是某个父类的子类,它的super就不会指向你说的那个父类 解决方案三: 肯定报错啊 没有继承父类,也没有实现接口的话 没有方法重写这一说

uiviewcontroller-swift怎么重写父类的init方法

问题描述 swift怎么重写父类的init方法 我想重写UITextFiled的方法,在init(frame)上加一个参数,init(frame:CGRECT,uiviewcontroller:UIViewController)请问如何重写 解决方案 重写是相同方法的不同实现,参数不同方法就不同了,楼主是想重载,如下两个例子可以清晰表现用法和区别: 例如UIView重写父类的init(frame: CGRect)方法: override init(frame: CGRect) { super.i

super-为什么子类重写父类方法之后还要调用父类同名方法

问题描述 为什么子类重写父类方法之后还要调用父类同名方法 为什么子类重写父类方法之后还要调用父类同名方法 比如public class A extends B { public void say ( ) { super.say ( ); } 为什么重写父类方法之后还要在方法体里面用super关键词调用父类的同名方法呢 解决方案 你可以不调用,这个你自定,不是必须 解决方案二: SubClasing用法--子类重写父类方法,父类直接调用实现方式子类调用父类方法子类调用父类方法 解决方案三: 我想到

iOS重写父类中的方法时要先调用父类中的方法的原因

现有两个类: 1.Object001继承自NSObject #import <Foundation/Foundation.h>   @interface Object001 : NSObject   //Object001的头文件,我只是在这里面声明了个方法 -(void)printfString;   @end   #import "Object001.h"   @implementation Object001   //Object001的实现文件,我实现了声明的pri