小白学开发(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
// 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
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 如何成为一名专家级的开发人员
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- AS3自写类整理笔记 ClassLoader类第1/2页
- AS3自写类整理笔记 Dot类第1/2页
- DB2新手使用的一些小笔记:新建实例、数据库路径不存在、客户端连接 .
- perl脚本学习指南--读书笔记
- 《C++ primer plus》读书笔记(三)
- 《C++ primer plus》读书笔记(二)
- .NET微信公众号开发之公众号消息处理
- 使用nodejs开发cli项目实例
- jquery 笔记 事件
- nodejs开发微博实例
- Egret引擎开发指南之创建项目
- Android开发自学笔记(二):工程文件剖析