您的位置:首页 > 移动开发 > Objective-C

黑马程序员——Objective-C——封装、继承、多态

2014-12-07 14:33 471 查看
———Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
———

OC的三大特性:封装、继承、多态。

一、封装

1.set方法和get方法

1>set方法:

一般不在成员变量名前面使用@public、@protected等关键字修饰,而是使用set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。

set方法的作用:为外界提供一个设置成员变量值的方法

命名规范:

a. 方法名必须以set开头

b. set后面跟上成员变量的名称,首字母大写

c. 返回值一定是void

d. 一定要接收一个参数,而且参数类型需要和成员变量的类型一致

e. 形参名不能喝成员变量名一样(苹果官方推荐成员变量名前加_以示区分)

set方法的好处:

a. 不让数据暴露在外,保证了数据的安全性

b. 对设置的数据进行过滤

2>get方法

作用:为调用者返回对象内部的成员变量

命名规范:

a. 一定有返回值,返回值的类型和成员变量的类型一致

b. 方法名和成员变量名一样

c. 不需要接收任何参数

3>set方法和get方法的使用:

// .h文件中
@interface Person : NSObject  // 一般所有的类最终都要继承NSObject
{
int _age;
NSString *_name;
}
// _age的set和get方法
- (void) setAge: (int)age;
- (int) age;
// _name的set和get方法
- (void) setName:(NSString *)name;
- (NSString *)name;

@end  // 注意end不要漏掉
// .m文件中
@implementation Person
// 方法的实现
- (void) setAge: (int)age
{
_age = age;
}
- (int) age
{
return _age;
}
- (void) setName:(NSString *)name
{
_name = name ;
}
- (NSString *)name
{
return _age;
}

@end // 同样不要漏掉

4>set和get方法的使用注意

a. 在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。

b. 成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:(1)与get方法的方法名区分开来;(2)可以喝一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。

5>self关键字

记住一点:谁调用的self,self就代表谁。即类调用self就代表类,对象调用self就代表对象。

二、继承

1>继承的好处:

a. 抽取出了重复的代码

b. 建立了类和类之间的联系

c. 子类可以拥有父类中的所有成员变量和方法

2>继承的缺点:

耦合性太强,也就是说如果父类没了,子类就不能用了

3>注意点

a. 基本上所有类的根类是NSObject

b. 父类必须声明在子类的前面

c. 父类和子类不能拥有相同的成员变量

d. 调用某个方法时,优先去当前类中找,如果找不到,在去父类中找

e. OC中的类只能单继承

4>继承实例练习:

@interface Animal : NSObject  // 所有的类最好都继承NSObject类
{
int _age;
}
// set和get方法的声明
- (void) setAge:(int)age;
-(int)age;
// 声明一个对象方法
- (void) eat;
@end // 一般写interface和implementation时就跟上一个end,防止忘记了
@implementation Animal
// set和get方法的实现
- (void) setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)eat
{
NSLog(“%d岁的动物在吃东西”,_age);
}
@end
@interface Dog : Animal // 继承了Animal类
{
double _weight;
}
// set和get方法的声明
- (void)setWeight(double)weight;
-(double)weight;
-(void)run;
@end
@implementation Dog
// set和get方法的实现
- (void)setWeight(double)weight
{
_weight = weight;
}
-(double)weight
{
return _weight;
}
-(void)run // 声明一个对象方法
{
NSLog(%d岁%f重的狗在跑,_age,_weight);
}
@end
main.m中:
// 这里先导入Animal和Dog类的头文件(.h)
#import “Animal.h”
#import “Dog.h”
int main()
{
Animal *a = [Animal new];
a.age = 10;
[a eat];
Dog *d = [Dog new];
d.age = 20;  // 狗继承了Animal类,也有age属性
d.weight = 45.6;
[d run];
[d eat]; // 调用父类的方法
return 0;
}

三、多态

多态即为一类事物的多种形态。多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态;在使用多态时,会进行动态检测,以调用真实的对象方法;多态在代码中的体现即父类指针指向子类对象。

1.多态的好处

用父类接收参数,节省代码

2.多态的局限性

不能访问子类的属性,但是需要时可以考虑强制转换

3.多态实例

代码简写:

@interface Animal : NSObject  // 动物类继承NSObject类
- (void)eat;
@interface Dog : Animal  // 狗类继承动物类
- (void)kanMen;
@interface Cat : Animal // 猫类继承动物类
- (void)catchMouse;
Animal *a1 = [Dog new];  // 父类类型指向子类对象
Animal *a2 = [Cat new];
Dog *d = (Dog *)a1; // 强制转换
Cat *c = (Cat *)a2;
[d kanMen];  // 调用子类方法
[c cathchMouse];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息