您的位置:首页 > 移动开发 > IOS开发

小白学开发(iOS)OC_继承(2015-07-26)

2015-07-27 22:16 405 查看
 //

//  main.m

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "Iphone.h"

#import "Anycall.h"

int main(int argc, const char * argv[]) {

/*

    1. 继承:封装、继承、多态是面向对象语言中的三大特性,OC中也不例外

         继承指的是:一个类如果继承另一个类,那么被继承的类称为父类,继承的类称为子类

                   子类如果继承了父类,那么就可以获得父类的属性和方法

    2. 例子:这里创建Phone手机类、Iphone类、和Anycall类为例,学习类的继承

 

    3. 继承语法:在类的声明名称后加上一个 : 号 后面跟上父类的名称代表着Iphone类继承了

               Phone类,Iphone类就拥有了Phone类里面所有的属性和方法

 */

/*

    4. 这里Iphone类和Anycall类继承了Phone类验证子类创建的对象是否能访问父类的成员变量和方法

            > 子类可以通过类名调用父类的类方法

            > 子类可以通过new出对象,让对象调用其父类的对象方法

            > 子类可以通过对象访问父类的成员变量(这里是权限允许的情况下)

 */

    Iphone *ip = [Iphone new];          // 创建子类对象

//  注:这里的new方法其实也是Phone从其父类NSObject类中继承过来的,那么Iphone继承了Phone类

//      进而也继承了NSObject类中的new方法

    [ip cameraWithFlashlightStatus:kFlashlightStatusOpean]; // 子类对象成功调用父类方法

    NSLog(@"打印Iphone类创建的对象调用的属性cpu = %d",ip->_cpu);// 子类对象成功调用父类属性cpu

    

    Anycall *a = [Anycall new];

    [a cameraWithFlashlightStatus:kFlashlightStatusClose];

    NSLog(@"打印Anycall类创建的对象调用的属性cpu = %d",a->_cpu);

    

//    [Iphone test];  // 这里使用子类Iphone的类名,调用父类Phone的类方法

//    

//    [ip test];  //  使用子类Iphone的类名,调用父类Phone的类方法

/*

    5. 方法重写:如果在子类中实现了和父类中同名同类型的方法,我们称之为重写

             > 在继承当中调用方法,首先会在本类中找,如果本类没有找到就去父类中找

             > 在子类中不仅可以重写父类当中的对象方法,也可以重写父类当中的类方法

 */

//  经过子类重写test方法后

    [Iphone test];

    [ip test];

//  打印结果为:

//      Iphone子类重写了父类test(类方法)啊

//      Iphone子类重写了父类test(对象方法)啊

  

    return 0;

}

/*

    6. 总结

 

         当A类继承了B类, A类就拥有了B类所有的成员变量和方法

 

         优点:

            > 继承的出现减少了代码量

            > 提高了代码的安全性

            > 让类与类之间产生了关系

            > 让phone和Iphone有了关系 (父子关系),正是因为有了父子关系才有多态的特性

            > 让Iphone和Anycall有了关系(兄弟关系)

         

         坏处:

            > 耦合性太强

         

         注意点:

            > 如果子类实现了和父类一模一样的方法我们称之为重写

            > 子类当中不能定义和父类相同的成员变量

            > OC只支持但继承不支持多继承(即:一个类继承多个类)

            > OC中可以有多层继承

         

         子父类中的方法调用顺序:

              现在本类中找,如果本类没有再到父类中找,如果父类中没有,就到爷爷类中找

              NSObject是几乎所有类的父类

         

         查看父类中的功能, 建立子类对象使用功能

 

 */

//

//  Phone.h

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import <Foundation/Foundation.h>

//  闪光灯状态

typedef enum

{

    kFlashlightStatusOpean,

    kFlashlightStatusClose

}FlashlightStatus;

@interface Phone : NSObject

{

    @public

    int _cpu;

}

//  拍照方法

- (void)cameraWithFlashlightStatus:(FlashlightStatus)status;

- (void)opeanFlashlight;

- (void)closeFlasglight;

- (void)setCpu:(int)cpu;

- (void)test;

+ (void)test;

- (int)cpu;

@end

//

//  Phone.m

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Phone.h"

@implementation Phone

- (void)cameraWithFlashlightStatus:(FlashlightStatus)status

{

    if (kFlashlightStatusClose == status) {

        [self opeanFlashlight];

    }

    NSLog(@"拍照!");

}

- (void)opeanFlashlight

{

    NSLog(@"Phone 打开闪光灯");

}

- (void)closeFlasglight

{

    NSLog(@"Phone 关闭闪光灯");

}

+ (void)test

{

    NSLog(@"+ Phone类 的类方法");

}

- (void)test

{

    NSLog(@"- Phone类 的对象方法");

}

- (void)setCpu:(int)cpu

{

    _cpu = cpu;

}

- (int)cpu

{

    return _cpu;

}

@end

//

//  Iphone.h

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Phone.h"

@interface Iphone : Phone

- (void)test;

+ (void)test;

@end

//

//  Iphone.m

//  继承和多态

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Iphone.h"

@implementation Iphone

- (void)test

{

    NSLog(@"Iphone子类重写了父类test(对象方法)啊");

}

+ (void)test

{

    NSLog(@"Iphone子类重写了父类test(类方法)啊");

}

@end

//

//  Anycall.h

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Phone.h"

@interface Anycall : Phone

@end

//

//  Anycall.m

//  继承

//

//  Created by admin on 15/7/26.

//  Copyright (c) 2015年 admin. All rights reserved.

//

#import "Anycall.h"

@implementation Anycall

@end 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息