OC中的面向对象三大特性
一、 封装
1、封装具体一点说就是对成员变量的封装,为了防止我们的成员变量被误操作,所以尽量不把成员变量设为public,而是通过set方法向外界提供一个接口,间接地更改类中的属性。通过set我们可以限制传入的值,是我们的代码更安全。
使用set方法要遵守一些规范,例如:
(1) 方法名必须以set开头;
(2) set后面直接加上成员变量名,并且第一个字母要大写,比如下面例子中的setAge方法;
(3) 返回值一定是void
(4) 一定要接收一个参数,参数类型和成员变量类型一致;
(5) 形参的名称不能跟成员变量名一样。
#import <Foundation/Foundation.h>
@interface Student:NSObject
{
@public
int _age;
}
//提供一个方法给外界设置age属性值
- (void)setAge:(int)newAge;
- (void)study;
@end
@implementation Student
//set方法的实现
- (void)setAge:(int)newAge
{
if(newAge <= 0)//对传进来的参数进行过滤
{
newAge = 1;
}
_age = Age;
}
- (void)study
{
NSLog(@"%d岁的学生在学习",age);
}
@end
int main()
{
Student *stu = [Student new];
//stu->age = 20;
[stu setAge:10];
[stdu study];
return 0;
}
2、通过get方法获取属性的值,同样需要遵守相应的规范:
(1)一定有返回值,与获取属性类型一致;
(2)方法名与成员变量名一致;
(3)不接收参数。
#import <Foundation/Foundation.h>
@interface Student:NSObject
{
@public
int _age;
}
- (vlid)age;
@end
@implementation Student
- (int)age
{
return age;
}
@end
int main()
{
[str age];
return 0;
}
二、 继承
1、继承就是子类拥有父类的所有属性和方法,这样做可以抽取重用的代码,减少代码量,使程序更精简。只需在类名后加上冒号,跟上需要继承的类名即可。
继承不可以随便使用,不能仅因为一个类的成员是另一个类成员的子集,而简单将其定义成子类,例如:
@interface Score:NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student:Score
{
//int _cScore;
//int _ocScore;
int _age;
}
@end
@implementation Student
@end
这里的成绩类有两个属性,与学生类的其中两个属性一样,但是两个类没有继承的关系,不能说“学生”是一个“分数”,所以这种情况不应该用继承,而是用“组合”。如下:
@interface Score:NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student:NSObject
{
//组合
Score *score;//把Score变成Student的一部分
int _age;
}
@end
@implementation Student
@end
所以如果两个类是“一个是另一个”的关系,用继承;而若是“一个类拥有另一个类”则用组合。
2、如果在子类中想调用父类的同名方法,需要用到super关键字,例如:
#import <Foundation/Foundation.h>
@interface Zombie:NSObject
- (void)walk;
@end
@implementation Zombie
- (void)walk
{
NSLog(@"往前挪两步----");
}
@interface JumpZombie:Zombie
@end
@implementation JumpZombie
- (void)walk
{
//跳两下
NSLog(@"跳两下----");
//走两下
[super walk];//调用父类的walk方法
}
@end
int main()
{
JumpZombie *jz = [JumpZombie new];
[jz walk];
return 0;
}
三、多态
多态是指对象的多种形态,主要是在类的继承时体现,可以说没有继承就不存在多态这个概念。
1. 多态的基本使用。这里有两个类,父类是Animal,子类是Dog。 “Animal *a = [Dog new];”这一句是把父类Animal的指针指向Dog类,对象a的本质还是Dog,所以用a来调用eat方法是调用Dog类的eat方法。
#import <Foundation/Foundation>
@interface Animal:NSObject
-(void)eat;
@end
@implementation Animal
-(void)eat
{
NSLog(@"吃东西----");
}
@end
@interace Dog:Animal
-(void)eat;
@end
@implementation Dog
-(void)eat
{
NSLog(@"Dog-吃东西----");
}
@end
int main()
{
//多种形态
Dog *d = [Dog new];//Dog类型
//多态:父类指针指向子类对象
Animal *a = [Dog new];
[a eat];//此时a对象的真实类型实际上是Dog类的对象,所以a调用的是Dog
//类的eat方法
NSObject *n = [Dog new];//也是多态
return 0;
}
2. OC中使用多态的注意事项。
Objective-C是弱类型语法,OC的编译器的容错能力很强,一些不合逻辑的语法或错的很离谱的语法在OC编译器编译时不会报错而只会警告。比如:
(1) 把子类的指针指向一个父类的对象;
例如:Dog *p = [Animal new];
(2) 把一个毫不相关的指针指向一个对象。
例如:NSString *s = [Dog new]。
上边这两种情况在其他的编译器会报错。
总结就是对象在实例化时等号左边的类无论是什么类型,OC的编译器都不会报错。
|
|