黑马程序员——OC基础---三大特性
三大特性
概述:
1、概念:OC中用于操作类和对象的规则和方法,包括封装、继承和多态。
2、作用:保证数据的安全,简明语法,增强类与类之间联系。
3、特点:通过构造函数或继承类,达到保证数据安全,简明语法的目的。
4、好处:数据始终在控制范围内,简明了语法。
5、弊端:父类调用子类特有方法,编译器报错,类与类之间的联系太过紧密,父类变化,导致其他子类变化。
1、成员变量的封装
Set方法:通过p->age = 20修改成员变量的方式容易导致出错,为保证数据安全,提供一个方法给外界设置成员变量值,并对输入数据过滤。
Set方法命名规范:
1> 方法名必须以set来头。
2> set后面跟成员变量名称,其首字母必须大写。
3> 返回值一定是(void)。
4> 一定要接受一个参数,而且参数类型跟成员变量类型一致。
5> 形参名称不能与成员变量名称一致。
Get方法:给外界提供一个查看成员变量的方法。
Get方法命名规范:
1>方法名与成员变量名一致。
2>肯定有返回值,返回值与成员变量名一致。
3>不需要接收任何参数。
示例:
@interface Person : NSObject
{
int age;
double height;
}
// age的getter和setter。
- (void)setAge:(int)age;
- (int)age;
// height的getter和setter。
- (void)setHeight:(int)height;
- (int)height;
@end
@implementation Person
// age的getter和setter的实现。
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
// height的getter和setter的实现。
- (void)setHeight:(int)height
{
_height = height;
}
- (int)height
{
return _height;
}
@end
注意:****************************************************
1、成员变量命名以下划线开头(便于与get方法和局部变量区分)。
2、OC弱语法[person test],源代码中没有test,编译器只有警告。
3、不声明任何方法属性,也可运行,编译器只有警告。
4、类方法以加号开头,可与对象方法重名,但不可用来访问对象方法。
5、方法内部不需要使用成员变量时就用类方法。
************************************************************
关键字self的使用:指向当前对象,可用[self 方法名]调用方法,也可用[self 成员变量名]访问成员变量。
总结与思考:set方法内部可以加上一些容错程序,禁止出现不符合逻辑等错误,对于有些属性,值是固定的,可以只写get方法,而不写set方法。
2、继承
说明:以@interface Person : NSObject 为例。:NSObject表示类Person继承了系统定义类NSObject的一切属性。
代码示例:
@interface Student : Person
@end
@implementation Student
@end
int main()
{
[student setAge:12];
NSLog(@"学生的年龄是%d",[student age]);
}
继承的好处:
1>抽取重复代码
2>建立类之间的关系。
3>子类可以拥有父类的所有成员变量和方法。
注意点:
1>基本上所有类的根类都是NSObject。
2>子类可以在父类的基础上继续延伸。
规范:
1>子类和父类中不可以有相同的成员变量。
2>子类和父类中可以有一样的方法名。
3>子类的方法重写可以覆盖父类的方法名。
4>父类必须声明在子类的前面。
5>对象里面的isa指针指向类,类里面的supperclass指针指向其父类。
6>执行时先在子类中找方法,找不到再去父类中找。
总结与思考:继承可以减少类别相同对象的属性和方法代码量,但它的缺点是耦合性太强,即类与类之间的关系过于紧密,父类方法的改变会影响子类方法的变化,所以父类的方法应该是少而应用广泛。
关键字supper的用法:
1>跨越所在块调用父类的方法。
2>在对象方法中,调用父类的对象方法,在类方法中调用父类的类方法。
3>使用场合:子类在重写父类方法时,想保留父类的一些行为。
@implementation Zoombie
- (void)walk
{
NSLog(@"跳两下----");
[supper walk]; // 保留父类对象的方法。
}
3、多态
概念:父类指针指向子类对象。
好处:如果函数参数中使用的是父类类型,可以传入父类子类对象。
局限性:父类对象调用只有子类对象拥有的方法时,编译器有警告,想调用此类方法,需要强制转换类型。
代码实现:
// 喂相应动物的相应方法。
//void feed(Dog *d)
//{
// [d eat];
//}
//
//void feed2(Cat *c)
//{
// [c eat];
//}
// 如果参数中使用的是父类类型,可以传入父类、子类对象,这样省略了很多重复代码。
void feed(Animal *a)
{
[a eat];
}
int main()
{
Animal *aa = [Animal new];
feed(aa);
Dog *dd = [Dog new];
feed(dd);
Cat *cc = [Cat new];
feed(cc);
return 0;
}
总结与思考: 多态主要用于多个子类使用一个对对象做同样操作的函数时,不需要写很多参数类型不同的函数,参数类型使用父类指针,所有的子类就可以向函数发送对象,这种功能减少了很多重复代码,但是因为OC是弱语法,用错误类型的指针指向对象,编译器只是报错,所以,书写时一定注意规范!
------- android培训、ios培训、期待与您交流! ----------