本帖最后由 米匠 于 2014-11-4 09:14 编辑
一、封装
首先说封装的好处,如果把类的成员变量前加@public,这样数据会不安全(即数据没有被封装),因为此时外界可以随意的调用成员变量,去改变值、访问值(即暴露)。面向对象的思想是对象内部结构不要暴露给外界。所以使用封装更加安全。
1、set方法
*给外界提供一个方法,用来对成员变量赋值
*set方法中可以对参数进行相应的的过滤
命名规范:
1>方法必须以set开头
2>set后面跟上成员变量的名称,成员变量的首字母必须大写
3>返回值一定是void
4>一定要接收一个参数,而且参数类型跟成员变量类型一致
5>形参名不能跟成员变量名一样
eg:
@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>不需要接收任何参数
eg:
@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
有时候一个类完全拥有另一个类的部分属性和方法,但是两个并无太大关系,所以应该考虑使用组合,而不是一味的使用继承。
关键字: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”。 |