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

简介:

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

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

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

首先做几个实验验证:

提供的源码如下:

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

 

为什么要这么做呢?

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

目录
相关文章
用原型链的方式写一个类和子类
用原型链的方式写一个类和子类
37 0
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
5月前
|
Java
子类的父类和接口具有共同的方法
子类的父类和接口具有共同的方法
36 7
类的继承和重写方法
类的继承和重写方法
76 0
继承类的方法
继承类的方法
119 0
|
安全 Java 调度
【Java并发】父类能调用子类的方法吗?
【Java并发】父类能调用子类的方法吗?
435 0
【Java并发】父类能调用子类的方法吗?
|
设计模式 安全 Java
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
称为类 B 继承类 A 特点: B类的对象可以使用 A类的属性和方法 优点: 代码复用.重复相同的代码不用多次书写. 名词: 类A: 父类 基类 类B: 子类 派生类 2. 单继承和多层继承[理解] 单继承: 如果一个类只有一个父类,把这种继承关系称为单继承 多继承: 如果一个类有多个父类,把这种继承关系称为多继承 多层继承: C–> B --> A 3. 子类重写父类的同名方法[掌握] 重写: 子类定义和父类名字相同的方法. 为什么重写: 父类中的方法,不能满足子类对象的需求,所以
562 1
Python面向对象、继承的基本语法、单继承和多层继承、子类重写父类的同名方法、子类调用父类的同名方法、继承中的 init 、 多继承、私有权限、类属性、类方法、静态方法、多态、鸭子类型
|
开发者 Python
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
ES6—45:子类对父类方法的重写
ES6—45:子类对父类方法的重写
156 0
ES6—45:子类对父类方法的重写
|
Java C++
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(一)
2357 0