2.面向对象之继承
来源:互联网 发布:软件测试linux面试题 编辑:程序博客网 时间:2024/06/06 02:22
第一部分 基础知识
1.什么是继承
如果类B继承了类A 则B中拥有A的所有东西,类A称为B的父类,类B称为A的子类。表达方法:@interface 类B:类A。
2.继承的使用场合
1)当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中;
2)当A类中完全拥有B类中得部分属性和方法时,可以考虑让B继承A类: 如果“B”是 “A”读着符合人们的思维(例如dog是Animal)使用继承;如果“B”属于“A”读着符合人们的思维(例如Score 属于 Student)则使用组合。
3.继承特性
1)抽取重复代码,精简代码量;
2)建立了类之间的关系;
3)子类中拥有了父类的所有东西。
4)耦合性太强,容易产生错误。当父类中属性产生需错误的时候则继承他的所有子类都产生错误。
4.重写
子类中心实现父类中的某个方法,覆盖父类以前的做法。
注意:1.父类必须声明在子类的前面;
2.OC不允许子类和父类拥有相同名称的成员变量(java可以);
3.子类中和父类中存在相同的方法时,优先调用子类中方法。如果子类中不存在时则从父类中找。
5.super(关键字)
1.作用:
1)直接调用父类中的某个方法;
2)super处在对象方法中,那么就会调用父类的对象方法; super处在类方法中,那么就会调用父类的类方法。
2.使用场合:子类重写父类的方法时想保留父类的一些行为。
第二部分 代码示例
1.继承代码示例
建立一个Person类和一个Student类,并且Student类继承Person类。
#import <Foundation/Foundation.h>@interface Person :NSObject// 对象方法- (void)eat;- (void)sleep;- (void)walk;// 类方法+ (void)walk;@end@implementation Person// 对象方法eat的实现- (void)eat{ NSLog(@"eat eat eat !");}// 对象方法sleep的实现- (void)sleep{ NSLog(@"sleep~");}// 类方法walk的实现+ (void)walk{ NSLog(@"调用了+walk");}// 对象方法walk的实现- (void)walk{ NSLog(@"调用了-walk");}@end// Student类继承自Person@interface Student :Person+ (void)does;- (void)does;// 重写父类中得walk方法- (void)walk;@end@implementation Student- (void)walk{ NSLog(@"调用了walk");}+ (void)does{ // 调用父类中得walk方法 [super walk]; NSLog(@"do + some thing");}- (void)does{ // self关键字:调用Student类中得walk方法 [self walk]; NSLog(@"do - some thing");}@end
1. main函数中直接调用Student的does方法:
int main( ){ [Student does]; return 0;}
运行结果:
2015-05-07 20:47:38.328 继承的使用[3538:303] 调用了+walk2015-05-07 20:47:38.330 继承的使用[3538:303] do + some thingProgram ended with exit code: 0当调用Student类的does时,直接运行了 + (void)does 这个方法,并且在这个方法中调用了父类中得 - (void)walk 方法。
2.当由子类对象调用does时:
int main( ){ Student *s = [Student new]; [s does]; return 0;}运行结果
2015-05-07 21:00:13.182 继承的使用[3620:303] 调用了walk2015-05-07 21:00:13.184 继承的使用[3620:303] do - some thingProgram ended with exit code: 0
当由对象调用does的时候,由于子类中重写了父类的walk方法,所以输出的是调用了walk;而不是: 调用了-walk。
3. 当由子类对象调用的eat时:
int main( ){ Student *s = [Student new]; [s eat]; return 0;}
运行结果:
2015-05-07 21:07:00.513 继承的使用[3665:303] eat eat eat !Program ended with exit code: 0Student对象继承了Person对象,也就拥有了Person的属性,并且子类中也没有重写eat,所以直接调用了父类中得eat方法
2.组合代码分析
// 定义Score类@interface Score : NSObject{ int _cScore; int _ocScore;}@end@implementation Score@end// 定义Student类@interface Student : NSObject{ // 组合 Score *_score; // int _age;}-(void)setScore:(Score *)score;-(Score *)score;@end@implementation Student-(void)setScore:(Score *)score{_score = score;}-(Score *)score{return _score;}@end相比于Student是Score而言,说Score属于Student更符合人们的思维,所以在此使用组合而不是继承,即在Student类中定义一个Score属性。
但是在定义一个Student类的时候还需要定义个Score类,并且使Student类指向Score类。
0 0
- 2.面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- 面向对象之继承
- ABAP 面向对象之继承
- JAVA-面向对象之继承
- Java面向对象之继承
- css:浮层
- java工程生成jar文件
- 两个类相互调用的例子
- UVa 12333 - Revenge of Fibonacci (大数 + 字典树)
- 使用Block模拟网络请求回调
- 2.面向对象之继承
- 链式二叉树的实现
- Oracal导出dmp文件
- C++中小数点引用和箭头的区别
- 第九周——运算符重载——项目三分数类(续)
- Some notes on shared libraries with ld
- OpenCV学习笔记(2)边缘检测与滑动条的创建
- Linux(ARM)下目录含义
- 【Tools.PowerDesigner】概念数据模型