OC第一讲面向对象
这讲主要:
(1)了解对象和类的区别与联系
(2)面向对象的三大特点:封装,继承,多态
(3)学会对象的创建和使用
(4)熟练掌握继承,初始化方法,指定初始化方法,便利构造器的用法
1.面想对象编程oop 面向过程的编程 opp
面向过程编程:分析解决问题的步骤,实现函数,依次调用面向对象编程:分解问题组成的对象,协调对象间的联系和通信, 解决问题。
对象定义了解决问题的步骤中的⾏行为,不刻意完成⼀一个步骤。以过程为中心,以对象为中心
2.面向对象永远离不开面型过程
面向对象设计具有良好的可扩展性,可重用性
类是具有相同特征和行为的事物的抽象
对象是类的实例的实例
类是对象的类型
万事万物皆对象
3.
⾯面向对象编程中使⽤用对象完成程序
开发中 : 先定义类 , 再创建对象 , 然后使⽤用对象。
定义类包含两部分 : 接⼝口部分和实现部分。分开写。
1. 接⼝口部分 : 对外声明类的特征和⾏行为。
2. 实现部分 : 对内实现⾏行为。
接⼝口部分标志 : @interface ... @end 作⽤用 : 声明类的实例变量和⽅方法 , 即特征和⾏行为。
包含内容 : 类名、⽗父类名、实例变量、⽅方法
%@表示所有类的对象
3.
1)
分配内存空间 :Person * p = [Person alloc]; 初始化 : p = [p init]; 通常这两部操作需要连写 : Person * p = [[Person alloc] init];
2)
+ ( id )alloc; + 表⽰示这个⽅方法属于类 , 只能类执⾏行。 id 返回值 类型 , 表⽰示任意类型的对象 , 即创建好的对象。
- ( id )init; - 表⽰示这个⽅方法属于对象 , 只能对象执⾏行。 id 返回值 类型 , 表⽰示初始化完成的对象。
//初始化
-(id)init
{
_type = @"奥迪S8";
_price = 20000000;
return self;
}
OC第二讲
1.public(公有的) 实例对象可以在类的外部和内部操作
protected(受保护的,默认的)实例对象只能在该类和其子类内操作
private(私有的)实例对象只能在该类内访问
2.OC中的⽅方法分两种:类⽅方法和实例⽅方法。
类⽅方法:只能类使⽤用,例如:+(id)alloc 注:类⽅方法中不能使⽤用 实例变量 实例⽅方法:只能对象使⽤用,例如: -(void)sayHi
3.在OC中使⽤用消息发送机制:[receiver message]。
[person sayHi];
正确表述:给student对象发送sayHi消息。 1)、student接收到消息,即⽅方法sayHi; 2)、student找到sayHi⽅方法,并执⾏。
4.-(id)init 这个初始化⽅方法只能给实例变量设置默认值,不灵活。
-(id)initWithName: ⾃自定义初始化⽅方法,根据需求定义初始化⽅方 法。
5.self 代表本类对象
6.告诉编译器@class后的字符串作为类名使⽤用,并未导⼊入类的接⼝内容。要在.m文件中用importe导入
有效避免嵌套循环导⼊。
7.方法是OC的核⼼心,采⽤用消息机制:[receiver message]。 “-”message由对象来调⽤用;“+”message由类来调⽤用。
OC第三讲
1.继承的上层:父类,继承的下层:子类。继承是单向的,继承具有传递性:A继承与B,B继承与C,A具有B和C的特征和行为。
子类能够继承父类所有的全部的特征和行为。
2.oc,中只允许但继承。
2.super是编译器指令,并⾮对象。
作⽤:给super发消息,可以执⾏父类中实现的方法。 实际上是在请求OC向该类的超类发送消息。如果超类中没有定义该消息将在继承链中继续查找相对应的方法。子类可以重写父类的⽅方法,即:子类既有自己的实现,又有父类 继承下来的实现,如果想使用父类的实现,向super发送消息。
3.学习继承之前,初始化⽅法,没有self = [super init]字样。我们为 实例变量逐一赋值。
学习继承之后,父类中声明了公共的实例变量。作为父类,也应该 有自己的初始化⽅方法,为这些公共实例变量赋初值。子类定义了除父类中公共实例变量之外的实例变量。在⾃自⾝身的初始 化方法中,优先向super发送init消息,初始化公共变量,初始化成 功之后,再初始化⾃身特有变量,从而完成全部实例变量的初始化。
4.初始化方法是“-”方法,id或者instancetype类型的返回值,以init开头,可以带0到多个参数,
内部实现:先执行super的初始化方法,在初始化自身变量,return self.
OC继承:打僵尸
#import <Foundation/Foundation.h>
@interface Jiangshi :NSObject
{
NSString *_type;
NSInteger _totleBloodValue;//总血量
NSInteger _reduceBloodValue;//被攻击时减少的血量
int _lastBloodValue;//剩余血量
bool _isDeath;//判断死亡状态
}
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue;
+(id)jiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue;
-(void)setType:(NSString *)type;
-(void)setTotleBloodValue:(NSInteger)totleBloodValue;
-(void)setReduceBloodValue:(NSInteger)reduceBloodValue;
-(NSString *)type;
-(NSInteger)totleBloodValue;
-(NSInteger)reduceBloodValue;
- (BOOL)isDeath;
- (void)death;
- (int)byAttackReduceBloodValue;
@end
#import "Jiangshi.h"
@implementation Jiangshi
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
{
self = [superinit];
if (self) {
_type = type;
_totleBloodValue = totileBloodValue;
_reduceBloodValue = reduceBloodValue;
}
return self;
}
+(id)jiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
{
Jiangshi *i = [[Jiangshialloc]
initWithNameType:type totileBloodValue:totileBloodValue reduceBloodValue:reduceBloodValue];
return i;
}
-(void)setType:(NSString *)type
{
_type = type;
}
-(void)setTotleBloodValue:(NSInteger)totleBloodValue
{
_totleBloodValue = totleBloodValue;
}
-(void)setReduceBloodValue:(NSInteger)reduceBloodValue
{
_reduceBloodValue = reduceBloodValue;
}
-(NSString *)type
{
return _type;
}
-(NSInteger)totleBloodValue
{
return_totleBloodValue;
}
-(NSInteger)reduceBloodValue
{
return_reduceBloodValue;
}
- (BOOL)isDeath
{
return_lastBloodValue<=0;
}
- (void)death
{
NSLog(@"已死");
}
- (int)byAttackReduceBloodValue
{
_lastBloodValue -=_reduceBloodValue;
return_lastBloodValue;
}
@end
#import "Jiangshi.h"
@interface Daojujiangshi :Jiangshi
{
NSString *_daoju;
}
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju;
+(id)daojujiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju;
- (BOOL)isloseProp;
- (void)setReduceBloodValue:(int)reduceBloodValue;
- (int)byAttackReduceBloodValue;
@end
@implementation Daojujiangshi
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
{
self = [superinitWithNameType:type totileBloodValue:totileBloodValue reduceBloodValue:reduceBloodValue];
if (self) {
_daoju = daoju;
}
return self;
}
+(id)daojujiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
{
Daojujiangshi *d = [[Daojujiangshialloc]
initWithNameType:type totileBloodValue:totileBloodValue reduceBloodValue:reduceBloodValuedaoju:daoju];
return d;
}
- (BOOL)isloseProp
{
return_lastBloodValue<(_totleBloodValue*0.5);
}
- (int)byAttackReduceBloodValue
{
if ([self isloseProp]) {
_lastBloodValue -=_reduceBloodValue ;
}else
_lastBloodValue -=(_reduceBloodValue-1) ;
return_lastBloodValue;
}
@end
#import "Daojujiangshi.h"
@interface Tietongjiangshi :Daojujiangshi
{
NSString *_weakness;
}
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
weakness:(NSString *)weakness;
+(id)tietongjiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
weakness:(NSString *)weakness;
- (BOOL)isloseProp;
- (BOOL)isWeakness;
- (int)byAttackReduceBloodValue;
@end
#import "Tietongjiangshi.h"
@implementation Tietongjiangshi
-(id)initWithNameType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
weakness:(NSString *)weakness
{
self = [superinitWithNameType:type totileBloodValue:totileBloodValue reduceBloodValue:reduceBloodValuedaoju:daoju];
if (self) {
_weakness = weakness;
}
return self;
}
+(id)tietongjiangshiWithType:(NSString *)type
totileBloodValue:(NSInteger)totileBloodValue
reduceBloodValue:(NSInteger)reduceBloodValue
daoju:(NSString *)daoju
weakness:(NSString *)weakness
{
Tietongjiangshi *z = [[Tietongjiangshialloc]
initWithNameType:type totileBloodValue:totileBloodValue reduceBloodValue:reduceBloodValuedaoju:daoju weakness:weakness];
return z;
}
- (BOOL)isloseProp
{
return_lastBloodValue<=(_lastBloodValue*0.3);
}
- (int)byAttackReduceBloodValue
{
if ([self isloseProp]) {
_lastBloodValue -=_reduceBloodValue;
}else
_lastBloodValue -=_reduceBloodValue-2;
return_lastBloodValue;
}
@end
int main(int argc,const char * argv[])
{
@autoreleasepool {
Jiangshi *i = [JiangshijiangshiWithType:@"普通僵尸"totileBloodValue:50reduceBloodValue:3];
// [i byAttackReduceBloodValue];
Daojujiangshi *d = [DaojujiangshidaojujiangshiWithType:@"道具僵尸"totileBloodValue:80reduceBloodValue:2 daoju:@"飞镖"];
Tietongjiangshi *z = [TietongjiangshitietongjiangshiWithType:@"铁桶僵尸"totileBloodValue:120reduceBloodValue:1 daoju:@"飞镖" weakness:@"头部"];
// [z byAttackReduceBloodValue];
while (1) {
int lastBloodValue = [i byAttackReduceBloodValue];
NSLog(@"剩余血量:%d",lastBloodValue);
if ([i isDeath]){
[ideath];
break;
}
}
while (1) {
int lastBloodValue = [d byAttackReduceBloodValue];
NSLog(@"剩余血量:%d",lastBloodValue);
if ([d isDeath]){
[ddeath];
break;
}
}
while (1) {
int lastBloodValue = [z byAttackReduceBloodValue];
NSLog(@"剩余血量:%d",lastBloodValue);
if ([z isDeath]){
[zdeath];
break;
}
}
return 0;
}
}