黑马程序员——OC语言——三大特性

来源:互联网 发布:迅雷for mac os10.6.8 编辑:程序博客网 时间:2024/06/10 11:03
———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
一、封装
1、set和get方法
set方法
- (void)setAge:(int)newAge;
提供一个方法给外界设置成员变量值
1> 方法名必须以set开头
2> set后面跟上成员变量名称,首字母必须大写
3> 返回值一定是void
4> 一定要接收一个与成员变量类型一致的参数
5> 形参不能与成员变量同名
get方法
- (int)age;
返回对象内部的成员变量
1> 肯定有返回值,与成员变量类型一样
2> 方法名跟成员变量名一样
3> 不需要接收参数

成员变量

1> 成员变量都以_开头,便于区分

2> 尽量不要使用@public,以便更好实现封装

#import <Foundation/Foundation.h>

@interface Car : NSObject

{

int _wheels;

}

// set方法声明

- (void)setWheels:(int)wheels;

// get方法声明

- (int)wheels;

@end;

@inplementation Car

// set方法实现

- (void)setWheels:(int)wheels

{

_wheels = wheels;

}

// get方法实现

- (int)wheels

{

return _wheels;

}

@end

2、self

当成员变量和局部变量同名时,系统就会采取就近原则,访问局部变量,而不是访问成员变量。

这时,我们可以用self访问成员变量,区分同名的局部变量。

使用场合:所有OC方法中,包括对象方法和类方法,不能用于函数。

用法:谁调用当前方法,self就代表谁(方法调用者)

self出现在对象方法中,self代表对象

self出现在类方法中,self代表类

格式:

1> self -> 成员变量名

访问当前方法调用的成员变量

2> [self 方法名]

调用方法(对象/类方法)

常见错误:

1> 用self调用函数

2> 类方法中用self调用对象方法,对象方法中用self调用类方法

3> self死循环

@implementation Car

- (void)test

{

// 死循环

[self test];

}

@end


二、继承

* 将具有相同属性和行为的类,抽取出一个父类;

* 子类在父类的基础上,再扩充属性和方法;

* 子类的方法和属性的访问过程:先去子类里面找,如果子类没有,再去父类里面找;

* 父类被继承了,但是还是可以照常使用这个类;

* 全部OC类的最终父类是NSObject,包含很多常用方法,例如+new;

*专业术语:父类/超类 superclass、子类 subclass/subclasses

#import <Foundation/Foundation.h>

// Animal声明

@interface Animal : NSObject

{

double _weihgt;

}

- (void)eat;

@end

//Animal实现

@implementation Animal

- (void)eat

{

NSLog(@"体重是%d的动物吃东西了",_weight);

}

@end

// Dog声明

// :Animal代表继承了Animal,拥有了Animal里面所有的成员变量和方法

// Animal称为Dog的父类,Dog称为Animal的子类

@interface Dog : Animal

{

int _age;

}

- (void)run;

@end

// Dog实现

@implementation Dog

- (void)run

{

NSLog(@"%d岁的狗跑起来了",_age);

}

@end

1、继承的好处和坏处

好处:1> 不改变原来模型的基础上,扩充方法;

2> 建立了类与类之间的联系;

3> 抽取了公共的代码,减少代码编写;

4> 子类可以拥有父类的所有成员变量和方法。

坏处:耦合性强,改一类而动很多类。

2、继承的使用场合

1> 当两个类拥有相同的属性和方法的时候,就可以将相同的东西抽取到一个父类中;

2> 当A类完全拥有B类中部分属性和方法时,可以考虑让B类继承A类,或考虑B类组合A类。

3、继承的注意事项

1> 继承是单继承,不能继承自多个类;

2> 父类必须声明在子类前面;

3> 子类和父类不能有相同的成员变量;

4> 子类可以重写父类的方法。

4、super

格式:[super 方法名];

super的作用:直接调用父类中的某个方法

super在对象方法中,就调用父类的对象方法

super在类方法中,就调用父类的类方法

5、继承和组合

继承:xxx 是 xx

组合:xxx 拥有 xx

#import <Foundation/Foundation.h>

@interface Score : NSObject

{

int _cScore;

int _ocScore;

}

@end

@inplementation Score

@end

// 学生不是成绩,只是拥有成绩,所以不用继承

@interface Student : NSObject

{

// 组合

Score *_score;

int _age;

}

@end


三、多态

1、基本概念

某一类事物的多种形态

OC对象具有多态性

2、多态的实现

Person *p = [Student new];

p -> age = 24;

[p study];

1> 没有继承就没有多态

2> 子类对象赋值给父类指针,父类指针可以访问对应成员变量和方法

3> 调用方法时会检测对象的真实类型

3、好处与局限性

好处:如果函数、方法参数中使用的是父类类型的,可以传入父类、子类对象。

局限性:不能访问子类的属性(成员变量),

不能调用子类特有的方法(子类有父类没有的方法)(除非强制类型转换)

#import <Foundation/Foundation.h>

@interface Animal : NSObject

- (void)eat;

@end

@implementation Animal

- (void)eat

{

NSLog(@"Animal吃东西");

}

@end

@interface Dog : Animal

- (void)run;

@end

@implementation Dog

- (void)eat

{

NSLog(@"Dog吃东西");

}

- (void)run

{

NSLog(@"Dog跑起来了");

}

@end

// 若形参中使用父类类型,可传入父类对象和子类对象

void feed(Animal *a)

{

// 运行时会动态检测a对象的真实类型

[a eat];

}

int main()

{

// 多态:父类指针指向子类对象

Animal *aa = [Dog new];

feed(aa);

// [aa run]编译器警告

// 强制类型转换

Dog *dd = (Dog *)aa;

[dd run];

}









0 0
原创粉丝点击