------Java培训、Android培训、iOS培训、.Net培训期待与您交流!------
一、封装
封装的好处:对类中的一些字段,方法进行保护,不被外界访问到。
oc中四种访问权限修饰符
@public、@protected、@private、@package
在开发过程当中,我们用set和get方法来改变和获取成员变量的值
1.set方法
Set方法的作用:为外界提供一个设置成员变量值的方法
命名规范:
(1)方法名必须以set开头
(2)Set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能和成员变量名一样(官方推荐成员变量名前加_以示区分)
例如
#import<Foundation/foundation.h>
@interface Student:NSObject
{ //这里不用@public修饰了
int _age;
}
//set方法声明,接受一个参数
-(void)setAge:(int)age
- (void)print;
@end
@implementation Student
- (void)setAge:(int)age
{
_age=age;//把参数的值赋值给成员变量
}
-(void)print
{
NSlog(@"age=%d",_age);
}
@end
int main()
{
Student *p=[Student new];
[p setAge:10];//调用set方法
[p print]; //查看age的值
return 0;
}
2.get方法
Get方法的作用:为调用者返回对象内部的成员变量
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
#import<Foundation/foundation.h>
@interface Student:NSObject
{
int _age;
}
//set方法声明,接受一个参数
-(void)setAge:(int)age
- (int)Age; //get 方法声明
@end
@implementation Student
- (void)setAge:(int)age
{
_age=age;//把参数的值赋值给成员变量
}
- (int)Age
{
return _age; //get方法实现,返回请求的数据
}
@end
int main()
{
Student *p=[Student new];
[p setAge:10];//调用set方法
[p print]; //查看age的值
return 0;
}
get和set方法注意事项
(1)在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的
数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。
(2)成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:
1)与get方法的方法名区分开来;2)可以和一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量
二、继承
继承的特点:
>抽取重复代码
>建立类之间的关系
>子类可以拥有父类中所有成员变量和方法
>所有的类的根类是NSObject
/声明:动物类
@interface Animal:NSobject
{
int _age;
double _weight;
}
- (void)setAge:(int) age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
//实现动物类的方法
@implementation Animal
- (void)setAge:(int) age
{
_age=age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight=weight;
}
- (double)weight
{
return _weight;
}
@end
//声明猫类 继承自动物类
@interface Cat:Animal
@end
int main()
{
Cat *p =[Car new]; //因为cat继承自动物,所以动物的所有成员变量和方法都可以
用
[p setWeight:100];
[p setAge:20];
Nslog(@"the cat age is %d",[p age]);
Nslog(@"the cat weight is %d",[p weight]
}
继承中需要注意的点
>父类的声明需要写在子类声明之前
>子类和父类不能拥有相同的成员变量
>子类方法可以和父类相同,调用是后就近原则
继承的使用场合
>当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
>当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
@interface student : NSObject
{
int _class;
int _heiht;
}
- (void)run;
@end
@implementation student
- (void)run
{
NSlog(@"the student is runing");
}
@end
@interface primary :student
{
int _class //error 不能拥有相同的成员变量
}
- (void)run;
@end
@implementation primary
- (void)run //方法重写,就近会用自己类中的对象;
{
NSlog(@"the primary is runing");
}
@end
------------------------------------------------------
在某些场合,虽然双方都具有继承逻辑特征,但是,并不适合:这时候需要组合
组合的例子
@interface Score : NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface student :NSObject
{
Score *score; //组合 :分数可以作为学生的一部分,学生拥有成绩
int _age;
}
@end
@implementation Student
@end
继承中的super
super的作用
>直接调用父类中的某个方法
>super处在对象方法中,那么就会调用父类的对象方法
处在类方法中,那么就会调用父类的类方法
使用场合:
使用在子类重写父类方法时想保留父类的一些行为
interface Cat : NSObject
- (void)run;
- (void)test;
+ (void)test;
@end
@implementation Cat
- (void)walk
{
NSLog(@"Cat run");
}
- (void)test
{
NSLog(@"Cat + test");
}
+ (void)test
{
NSLogg(@"Cat - test");
}
//黑猫
@interface blackCat : Cat
+ (void)testjump;
@end
@implementation blackCat
+ (void)testjump
{
[super test];
}
- (void)run
{
NSLog(@"the cat Jump");
[super run];//在自己的walk中引用了父类的walk方法
}
int main(){
[blackCat testjump];
blackCat *p=[blackCat new];
[p walk];
}
三、多态
多态的体现
>子类对象赋值给父类指针
>父类指针访问对应的属性和方法
多态的好处
>多态的好处是简化了编程接口,允许在类和类之间重用一些习惯的命名,也可以使代码可以分散在
不同的对象,而不用试图在一个函数中考虑到所有可能的对象,使代码的扩展性和复用性更好一些。
例如
在animal父类中有eat 方法,在cat和dog中重写了父类的eat方法,这样可以用多态调用eat方法
Animal *Animal=nil;
实例化猫对象
animal = [cat new];
[animal eat];
调用的是猫的eat;
animal=[dog new];
[animal eat];
调用的是狗的eat方法