三大特性:
封装,继承,多态
封装:
当类中的属性加 @public 为公共对象是 传入的实参可能是不合理的,这时可以提供一个方法给外界设置属性值,这种方法一般叫做set方法。
set方法: 提供一个方法给外界设置成员变量
声明:(规范) 方法名必须以set开头 后面跟成员变量的名称,首字母必须大写;返回值一定是void,一定要接受一个参数 类型必须和成员变量一致 形参的名称不能和成员变量一样
- (void)setAge:(int)newAge;
get方法:访问成员变量的值
声明:(规范)方法名跟成员变量名一致 肯定有返回值,与成员变量的类型一致,不需要就收任何参数
- (void)age
- (void)age {
return age;
}
封装的作用: 保证数据的安全,隐藏细节 一些值对于外界是只读的,不可修改只用get方法达到只读的特性
self: self是一个指针,指向当前调用对象,谁调用这个方法就指向谁对于类方法也适用
1 当方法内有重名时 如果希望访问类中的成员变量,用self
2 [self 对象方法]
@interface Person NSObject
{
int _age
}
@end
@implementation Person
- (void)test{
int _age=20
//这时NSLog访问的age是成员变量中的_age
NSLog(@"%d",self->_age)
}
@end
//调用这个方法时用self会先执行调用对象的bark方法
- (void) run {
[self bark];
}
继承:继承另一个类中所有的成员变量和方法
作用:
1抽取重复代码
2建立了类之间的联系
注意:1比本上所有的根类都是NSObject
2 父类写在最上面
3调用方法时会优先子类中的方法如果没有再去找父类中的方法
4子类重新实现父类中的某个方法叫做 重写
5耦合性太强
继承的适用场合:
1当两个类中有相同属性和方法时可以抽取到一个父类中
2当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A(需要符合代码设计逻辑)
//这里的NSObject就是继承 在冒号: 后面加要继承的类
@interface Animals : NSObject
//animals为Dog的父类
@interface Dog : Animals;
组合:也是为了达到继承的效果 ,为了设计逻辑的合理性可以使用组合
用法:
使用指针指向需要拥有的类
@interface Report:NSObject
@end
@implementation Report
@end
@interface Student:NSObject
{
//组合的使用:student拥有Score
Score *_score
}
@end
组合与继承:
继承:XX是XX
组合:XX拥有XX
多态 : 多种形态(没有继承就没有多态)
多态的作用:如果参数中使用的是父类类型,可以传入父类,子类对象(利用父类的指针达到节省代码的作用)
多态的局限性:
不能用父类的指针变量调用子类的方法(可以执行但是不符合语法规范)
没有继承就没有多态
#import <Foundation/Foundation.h>
@interface Animal:NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat {
NSLog(@"Animal eat");
}
@end
@interface Dog : Animal
- (void)eat;
@end
@implementation Dog
- (void)eat {
NSLog(@"Dog eat");
}
@end
@interface Cat : Animal
- (void)eat;
@end
@implementation Cat
- (void)eat {
NSLog(@"Cat eat");
}
@end
//用来喂食
//多态的作用:如果参数中使用的是父类类型,可以传入父类,子类对象
void feed(Animal *a){
[a eat];
}
int main(int argc, const char * argv[]) {
//多态:父类指向子类对象
//同理 NSObject *a=[Animal new]也是合理的
Animal *d=[Dog new];
//调用方法时会检测对象的真实类型 所以会优先执行Dog中的eat方法
[d eat];
//这样是不合理的 应为Cat没有继承Dog
// Cat *c=[Dog new];
//同样是不合理的
// Cat *c1=[Animal new];
//多态的作用:如果参数中使用的是父类类型,可以传入父类,子类对象
feed(d);
return 0;
}