封装,继承,多态
封装
- 1.首先,不能使用@public。因为一旦使用@public就意味着外界可以直接访问对象的这个属性,外界一旦可以直接访问这个属性就可以任意的为这个属性赋值,所以必须要将这个功能关掉。
- 2.为类提供一个方法,这个方法专门为这个属性赋值。这个方法我们叫做setter。
- 3.去掉了@public我们在main函数中就无法直接读取对象的属性值了.所以, 需要再写一个方法,专门用来返回属性的值。这个方法我们叫做getter。
@interface Person : NSObject
{
//不能使用@public
NSString *_name;
int _age;
}
//setter
-(void)setName:(NSString *)name;
-(void)setAge:(int)age;
//getter
-(NSString *)name;
-(int)age;
@end
@implementation Person
//setter
-(void)setName:(NSString *)name
{
NSUInteger len = [name length];
if (len >= 2)
{
_name = name;
}
else
{
_name = @"无名";
}
}
-(void)setAge:(int)age
{
if (age >= 0 && age <= 150)
{
_age = age;
}
else
{
_age = 18;
}
}
//getter
-(NSString *)name
{
return _name;
}
-(int)age
{
return _age;
}
@end
这样 我们就可以使用点 "." 语法了
int main(int argc, const char * argv[])
{
Person *p = [[Person alloc]init];
p.age = 11;
p.name = @"张三";
NSLog(@"姓名:%@===年龄:%d",p.name,p.age);
return 0;
}
// 姓名:张三===年龄:11
继承
@interface 类名 : 父类的名字
@end
@implementation 类名
@end
继承的特点:
- 单根性
即一个类只能有一个父类,不能有多个父类。 - 传递性
A类从B类继承,B类从C类继承,那么A类就同时拥有B和C类所有的属性和行为。
NSObject类:
我们前面一直在使用的NSObject其实也是一个类,它是Foundation框架中的类,在这个类中有一个类方法叫做new,这个方法是用来创建对象的。这个方法的返回值是创建的这个对象的指针。
也就是说,如果要创建类的对象,就必须要调用这个new方法。也就是说我们必须直接的或者间接的从NSObject类继承。
另外,NSObject类之中还定义了一个属性,这个属性叫做isa指针,所以每一个子类对象中都有一个叫做isa的指针。
综上所述,NSObject类是OC所有类的父类,因为OC中的类全部都是直接或者间接的从它继承而来。
多态
多态指的是同一个行为对于不同的事物具有完全不同的表现形式。
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
@public
NSString *_name;
NSString *_color;
float _weight;
}
-(void)selfIntroduction:(NSString*)msg;//自我介绍
@end
@implementation Animal
- (void)selfIntroduction:(NSString*)msg{
NSLog(@"我叫%@ 毛色:%@ 重量:%fkg 我会叫%@",_name,_color,_weight,msg);
}
@end
@interface Cat : Animal
-(void)climb;
@end
@implementation Cat
- (void)selfIntroduction:(NSString *)msg{
NSLog(@"我只是一只猫猫,我只会%@",msg);
}
- (void)climb{
NSLog(@"猫咪会爬树");
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool
{
Animal *animal = [Animal new];
animal->_name = @"小花猫";
animal->_color = @"黄色";
animal->_weight = 2.0;
[animal selfIntroduction:@"喵喵喵"];
Cat *cat = [Cat new];
cat->_name = @"小白猫";
cat->_color = @"白色";
cat->_weight = 1.0;
[cat selfIntroduction:@"喵喵喵"];
[cat climb];
}
return 0;
}
总结例子
image.png
#import <Foundation/Foundation.h>
#import "Eyes.h"
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
Student *obj = [Student new];
obj->_age = 1;
Eyes *eyes = [Eyes new];
eyes->_num = 2;
obj->eyes = eyes;
NSLog(@"学生眼睛个数%d",obj->eyes->_num);
[obj run];
return 0;
}
//2021-07-28 16:32:22.875811+0800 TestOc[48875:443904] 学生眼睛个数2
//2021-07-28 16:32:22.876116+0800 TestOc[48875:443904] 学生会跑
Eyes.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Eyes : NSObject{
@public
int _num;
}
@end
NS_ASSUME_NONNULL_END
Eyes.m
#import "Eyes.h"
@implementation Eyes
@end
Person.h
#import <Foundation/Foundation.h>
#import "Eyes.h"
NS_ASSUME_NONNULL_BEGIN
@interface Person : NSObject{
@public
int _age;
Eyes *eyes;
}
-(void)run;
@end
NS_ASSUME_NONNULL_END
Person.m
#import "Person.h"
@implementation Person
- (void)run{
NSLog(@"人会跑");
}
@end
Student.h
#import "Person.h"
NS_ASSUME_NONNULL_BEGIN
@interface Student : Person
{
@public
int _no;
}
@end
NS_ASSUME_NONNULL_END
Student.m
#import "Student.h"
@implementation Student
- (void)run{
NSLog(@"学生会跑");
}
@end