您的位置:首页 > 编程语言 > C语言/C++

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

2014-12-19 09:48 134 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------

一、封装

首先说封装的好处,如果把类的成员变量前加@public,这样数据会不安全(即数据没有被封装),因为此时外界可以随意的调用成员变量,去改变值、访问值(即暴露)。面向对象的思想是对象内部结构不要暴露给外界。所以使用封装更加安全。

1、set方法

*给外界提供一个方法,用来对成员变量赋值

*set方法中可以对参数进行相应的的过滤

命名规范:

1>方法必须以set开头

2>set后面跟上成员变量的名称,成员变量的首字母必须大写

3>返回值一定是void

4>一定要接收一个参数,而且参数类型跟成员变量类型一致

5>形参名不能跟成员变量名一样

@interface Student : NSObject
{
//成员变量的命名规范:以下划线开头
//成员变量尽量不用@public
int _age;
}
- (void)setAge:(int)age;
@end
@implementation
- (void)setAge:(int)newAge
{
//对传来的参数进行过滤
if(newAge<=10)
{
newAge = 1;
}
_age = newAge;
}
@end
int main()
{
Student *stu = [Student new];
[stu setAge:10];
reutrn 0;
}


2、get方法

*返回对象内部的成员变量

命名规范:

1>肯定有返回值,返回值类型与成员变量一致

2>方法名跟成员变量名一致

3>不需要接收任何参数

@interface Student : NSObject
{
//成员变量的命名规范:以下划线开头
//成员变量尽量不用@public
int _age;
}
- (int)age;
@end
@implementation
- (int)age
{
return _age;
}
@end
int main()
{
Student *stu = [Student new];
//获取成员变量age,默认为0
int a = [stu age];
reutrn 0;
}


/*报错收集

error:-[Person test]:unrecognized selector sent to instance 0x7fd2ea4097c0

意为给地址为0x7fd2ea4097c0的Person对象发送了一个不能识别的消息:test为对象方法。因为OC使用了消息机制,所以调用对象的方法即是给对象发送消息。OC在运行过程中才会检测对象有没有实现相应的方法。

*/

类方法:

1>加号 + 开头

2>只能由类(名)来调用

3>类方法中不能访问成员变量(实例变量)



类方法的好处:

1>不依赖于对象,执行效率高

2>能用类方法,尽量用类方法

3>当方法内部不需要使用到成员变量时,就可以改为类方法

4>类方法名可以与对象方法同名



self的用法:

1、在对象方法里调用成员变量“self->_age”

2、调用当前对象方法或类方法“[self method]”

类和对象在内存中的变现形式:



注:类在使用之前会加载到内存中,并且把所有的方法(对象方法和类方法)放入方法列表中,而成员变量(实例变量)只有当创建对象(创建实例)的时候才会存在内存中。

二、继承

//Pserson继承了NSObject根类
@interface Person : NSObject
char * _name;
int _age;
- (void)method1;
+ (void)method2;
@end
@implementation
...
@end
//Tom继承Person,拥有Person中的所有成员变量和所有方法,Person称为父类,Tom称为子类
@interface Tom : Person
@end
@implementation
@end


继承的好处:

1、抽取重复代码

2、建立了类之间的关系

3、子类可以拥有父类中所有成员变量和方法



缺点:耦合性太强



继承注意:

1、父类至少要声明在子类前面

2、不允许子类和父类拥有相同名称的成员变量

3、调用某个对象的方法时,优先去当前对象中找。如果找不到,去父类中找。如果子类和父类中有相同名字的对象方法或相同名字的类方法,则为重写。



重写:子类重新实现父类中的某个方法,覆盖父类以前的做法。



继承的内存示意图:



继承使用场合:

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

2、当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A



有时候一个类完全拥有另一个类的部分属性和方法,但是两个并无太大关系,所以应该考虑使用组合,而不是一味的使用继承,如下:

@interface Score : NSObject
{
<span style="white-space:pre">	</span>int _cScore;
	int _ocScore;
}
@end

@implementation Score
@end
// 继承:xx是xxx
// 组合:xxx拥有xxx
@interface Student : NSObject
{
	// 组合
	Score *_score;
	// int _cScore;
	// int _ocScore;
	int _age;
}
@end


关键字:super

作用:

1、直接调用父类中的某个方法

2、super处在对象方法中,调用父类的对象方法

super处在类方法中,调用父类的类方法(取决于当前环境)

3、使用场合:子类重写父类的方法时想保留父类的一些行为

三、多态

父类指针指向子类对象

调用方法时会检测对象的真实形态

@interface Animal : NSObject
- (void)method;
@end
@implementation
- (void)method
{
NSLog(@”Animal’s method”);
}
@end
@interface Dog : Animal
@end
@implementation
- (void)method
{
NSLog(@”Dog’s method”);
}
@end
int main()
{
//父类指针指向子类对象
Animal *a = [Dog new];
//访问的是Dog的method方法,动态绑定
[a method];
return 0;
}


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



多态的局限性:父类类型的变量不能用来调用子类特有的方法,如果要调用,那么就将父类对象强制转换成子类对象,例如“(Dog *)animal”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: