OC第三讲(Inherit 继承)
来源:互联网 发布:七彩虹淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 13:06
一:
main.m文件中:
#import
#import "Person.h"
#import "Man.h"
#import "Bike.h"
#import "RoadBike.h"
int main(int argc, const char * argv[]) {
//OC中的继承特点
//1.单向继承, 一个父亲可以有多个子类, 一个子类只能有一个父类
//2.单根继承, 根类(基类)是NSObject
//继承: 子类可以继承父类的特征和行为
//NSObject , 基类, 内部定义了常用的方法
//+alloc, -init
NSObject *object = [[NSObject alloc] init];
Person *person = [[Person alloc] initWithName:@"人类"age:1000 gender:@"未知"];
NSLog(@"%@",person.name);
NSLog(@"%@",person.gender);
NSLog(@"%ld",person.age);
//%@:打印对象, <<span style="font-family: 'Heiti SC Light';" se-mark="1">类名: 地址>
NSLog(@"%@",person);
[person sayHi];
//建立继承关系后, 子类可以继承父类
//1.实例变量 public, protected
//2.公开的方法
//一个方法可以根据是否在*.h中声明分为
//1.如果在*.h中写了声明, 方法是公开的, 可以在类内部和外部进行使用
//1.如果在*.h中写了声明, 方法是私有的, 只能在类的内部进行使用
//注: OC没有绝对的私有方法
Man *man = [[Man alloc] initWithName:@"小头爸爸" age:34gender:@"男"];
man.color = @"绿色";
[man sayHi];
[man work];
//方法调用的过程
//1.先在本类里找方法, 如果找不到, 就调用
//2.没有找到方法, 就去父类里找, 如果在父类没有找到, 就依次向上, 去父类的父类中找,直到找到,并调用
// Man *atm = [[Man alloc] initWithName:@"aoteman奥特曼" age:45 gender:@"男nan" color:@"红褐色"];
//创建一个Bike
//继承于NSObject
//实例变量: 品牌, 价格(protected)
//写setter, getter方法
//写自定义初始化方法
//写便利构造器
//创建一个RoadBike
//继承于Bike
//实例变量: 品牌, 价格, 颜色(protected)
//写setter, getter方法
//写自定义初始化方法
//写便利构造器
Bike *bike = [Bike bikeWithType:@"永久" price:5458.15];
RoadBike *roadBike =[RoadBike roadBikeWithType:@"凤凰"price:4541.154 color:@"红色"];
//面向对象解决思路
//1.根据问题, 找出问题中出现的对象
//2.分析对象的特征和行为
//3.分析对象的继承关系, 把共有的特征和行为写在父类中, 子类只写独有一些特征和行为
//4.创建类(创建的顺序:先父类, 后子类)
//5.特征写成类的实例变量(考虑实例变量的可见度), 行为写成方法(考虑在哪里使用, 写成公开的,还是私有的?)
//6.如果外部访问实例变量, 写setter和getter方法; 如果想要为实例变量赋初值, 重新init方法; 如果想要快速的生成对象, 写自定义初始化方法或者便利构造器
//7.根据创建好的类,生成对应的对象, 解决对应的问题
二:
Person.h文件里:
#import
@interface Person : NSObject{
NSString *name;
NSInteger age;
NSString *gender;
}
- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender;
- (void)setName:(NSString *)aName;
- (NSString *)name;
- (void)setAge:(NSInteger)aAge;
- (NSInteger)age;
- (void)setGender:(NSString *)aGender;
- (NSString *)gender;
- (void)sayHi;
@end
三:Person.m文件里:
#import "Person.h"
@implementation Person
- (id)init{
//C语言中用NULL
//OC中用nil
//使用super调用父类的init方法, 并使用self接受方法的返回值
self = [super init];
//判断self是否为nil, 如果是nil, 说明父类初始化失败; 如果不为nil, 父类初始化成功, 接着再对奔雷的实例变量赋值
if (self != nil) {
//本类的实例变量赋值(每个类只需要关心自己的实例变量的赋值,从父类继承过来的实例变量有父类自己管理)
name = @"账单";
gender = @"男";
age = 18;
}
return self;
}
- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender{
if (self = [super init]) {
name = aName;
age = aAge;
gender = aGender;
}
return self;
}
- (void)setName:(NSString *)aName{
name = aName;
}
- (NSString *)name{
return name;
}
- (void)setAge:(NSInteger)aAge{
age = aAge;
}
- (NSInteger)age{
return age;
}
- (void)setGender:(NSString *)aGender{
gender = aGender;
}
- (NSString *)gender{
return gender;
}
- (void)sayHi{
NSLog(@"我叫%@,性别%@,今年%ld岁了, 咱们交个朋友吧!嘿嘿!",name, gender,age);
}
@end
四:man.h文件中:
//修改继承关系步骤
//1.引入父类头文件
//2.@interface的冒号后面写上父类名
#import "Person.h"
@interface Man : Person{
NSString *color;
}
- (void)work;
- (void)setColor:(NSString *)aColor;
- (NSString *)color;
- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString *)aGender color:(NSString *)aColor;
@end
五:Man.m文件中
#import "Man.h"
@implementation Man
//版本1: 初始化时, 给自身和父类的实例变量赋值
//缺点: 初始化时, 需要关心父类的实例变量
//- (id)init{
// name = @"账单";
// gender = @"男";
// age = 18;
// color = @"紫色";
// return self;
//}
//
//版本2:初始化时, 给本类里的实例变量赋值
//缺点: 只给本类的实例变量赋值, 从父类继承过来的实例变量没有赋值
//- (id)init{
// color = @"紫色";
// return self;
//}
//版本3:初始化时, 每个类先通过[super init]调用父类的方法, 并对从父类继承过来的实例变量赋值,再对自身类中的实例变量赋值
//- (id)init{
// [super init];
// color = @"紫色";
// return self;
//}
//版本4: 使用self接受[super init]的返回值, 然后判断self是否为nil, 如果不为 nil, 说明父类初始化成功, 再对自身的实例变量赋值
//- (id)init {
// //self
// //1.在实例方法中, 代表对象, man
// //2.在类方法中, 代表类, Man
// self = [super init];
// if (self != nil) {
// color = @"紫色";
// }
// return self;
//}
//版本5:
- (id)init{
if (self = [super init]) {
color = @"紫色";
}
returnself;
}
//- (id)init{
// self = [super init];
// if (self) {
// color = @"紫色";
// }
// return self;
//}
//1.
- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender color:(NSString *)aColor{
// if (self =[super init]) {
// color = aColor;
// name = aName;
// age = aAge;
// gender = aGender;
// }
// return self;
//}
self = [super initWithName:aName age:aAge gender:aGender];
if(self){
color = aColor;
}
returnself;
}
- (void)work{
NSLog(@"%@在上班",name);
}
//当父类的方法, 不能满足子类的需求时, 子类可以重写父类的方法
//在子类中重新写父类的方法, 不需要写声明
//重写父类的方法
//1. 完全重写
//2. 在父类方法实现的基础上, 补充功能, 使用super调用父类方法
- (void)sayHi{
//super: 编译指令, 用于调用父类的方法
[super sayHi];
NSLog(@"我最喜欢的颜色是%@", color);
}
- (void)setColor:(NSString *)aColor{
color = aColor;
}
- (NSString *)color{
return color;
}
@end
六:BIke.h文件中#import
@interface Bike : NSObject{
NSString *type;
CGFloat price;
}
- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice;
+ (id)bikeWithType:(NSString *)aType price:(CGFloat)aPrice;
- (void)setType:(NSString *)aType;
- (NSString *)type;
- (void)setPrice:(CGFloat)aPrice;
- (CGFloat)price;
@end
七:Bike.m文件中:
#import "Bike.h"
@implementation Bike
- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice{
self = [super init];
if (self) {
type = aType;
price = aPrice;
}
returnself;
}
+ (id)bikeWithType:(NSString *)aType price:(CGFloat)aPrice{
return [[Bike alloc] initWithType:aType price:aPrice];
}
- (void)setType:(NSString *)aType{
type = aType;
}
- (NSString *)type{
return type;
}
- (void)setPrice:(CGFloat)aPrice{
price = aPrice;
}
- (CGFloat)price{
return price;
}
@end
八:RoadBile.h文件里:
#import "Bike.h"
@interface RoadBike : Bike{
NSString *color;
}
- (void)setColor:(NSString *)aColor;
- (NSString *)color;
- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString *)aColor;
+ (id)roadBikeWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString*)aColor;
@end
九:RoadBile.m文件里:
#import "RoadBike.h"
@implementation RoadBike
- (void)setColor:(NSString *)aColor{
color = aColor;
}
- (NSString *)color{
return color;
}
- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString *)aColor{
self = [super initWithType:aType price:aPrice];
if (self) {
color = aColor;
}
returnself;
}
+ (id)roadBikeWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString*)aColor{
return [[RoadBike alloc] initWithType:aType price:aPrice color:aColor];
}
@end
十:本讲结束..
- OC第三讲(Inherit 继承)
- OC 第三讲 继承初始化方法
- OC第三讲继承-动物类
- OC第三讲继承-模拟打僵尸
- OC-----第三讲
- OC----第三讲作业
- OC基础第三讲):继承 初始化方法 便利构造器
- 027.inherit 类的继承
- 027.inherit 类的继承
- OC基础第三章: 继承 、 封装、多态
- inherit
- CSS中inherit指定继承的使用方法
- CSS中inherit指定继承的使用方法
- 继承 (inherit )的使用与注意事项
- OC学习第三章 点语法 属性 继承 多态
- OC - 第三章 继承、初始化方法、便利构造器
- 第三讲
- 第三讲
- OC第四讲(NSString字符串)
- UI_快捷菜单
- 验证码生成中"图像因本身错误无法显示的"错误解决办法
- [c/c++]使用宏函数实现的无锁队列
- C语言第七讲(Struct结构体)
- OC第三讲(Inherit 继承)
- OC第二讲(InstanceVariableAndMethod实例变量和方法)
- 数字电路笔试题目
- C语言第六讲(Function函数)
- 使用 MyBatis 必看三篇文档导读:MyBatis、MyBatis_Generator 与 MyBatis-Spring
- C语言第五讲(ArrayPro二维与多维数组)
- 试验设计两因子无交互作用方差分析的r语言代码
- C语言第四讲(Array数组)
- C语言入门第三讲(循环Cycle)