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

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

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

首先做几个实验验证:

提供的源码如下:

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>

这样做的目的:

这就是软件设计中的不破坏原始接口的用处哦:)

时间: 2024-11-06 10:02:59

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

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

基类的方法被所有继承的子类继承,是不应该被修改的,如果继承的子类重写了基类的方法,那么,再从这个子类派生出子类的话,这个派生的子类接口已经破坏掉了统一的接口. 但有时候,我们需要一个子类能扩展基类的方法,但又不想破坏这个统一的接口,这时候,哥就来教你既能扩展功能,又能保证接口的统一性:) 首先做几个实验验证: 提供的源码如下: A类  B类  C类  (B类继承于A类,C类继承于B类) // // A.h // Super // // Copyright (c) 2014年 Y.X. All r

重写父类的方法及经典类和新式类的区别

1.父类重写的实例展示 (继承才有父类) # coding=utf-8 class Zll(): # def smile(self): #      print('哈哈哈') #      return 'aa' pass class Dcg(): def smile(self): print('啊啊啊啊啊') class Lw(): def smile(self): print('嘿嘿嘿') class Xz(Zll,Dcg,Lw):   #继承多个父类依次找父类是否有该方法,有就调用. de

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

若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:    重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会.出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的. 反正子类

odoo9 继承父类的方法和重写父类的方法

在odoo9 中的,要继承父类的方法或重写fulide方法,得先继承基础模块,之后直接继承装饰器就可以了.其中,基础模块是用"Home"代替的. from openerp.addons.web.controllers import main as webmain from openerp.addons.web.controllers.main import Home import re class odoo9login(Home, http.Controller):     @http

让子类必须重写父类的方法

//在编写子类的时候要重载父类的方法,如果子类不重写方法,则跑出异常让程序崩溃 - (void)superClassMethod { [NSException raise:NSInternalInconsistencyException format:@"It's an exception", NSStringFromSelector(_cmd)]; }

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

若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! 重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限.) 比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们 的机会.出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的. 重写规则之二: 参

python之重写父类方法

python之重写父类方法 修改父类的方法重写父类的方法的目的是为了给他扩展功能,父类的方法已经不能满足需求核心思想就一句话,先调用一下你要重写的父类方法, class Coon(object): #基本类 def __init__(self,host,password,port): self.host=host self.password = password self.port = port class CoonMysql(Coon): def __init__(self,host,pass

子类重载父类的方法“parent:方法名”

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

第9课:备份mysql数据库、重写父类、unittest框架、多线程

1. 写代码备份mysql数据库: 1)Linux下,备份mysql数据库,在shell下执行命令:mysqldump -uroot -p123456 -A >db_bak.sql即可 import os import datetime class BakDb(object): def __init__(self, ip, username, passwd, port=3306, path='/tmp/db_bak'): self.ip = ip self.username = username