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: 0
Student对象继承了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
原创粉丝点击