OC基础-面向对象的三大特征(四)

封装,继承,多态

封装

  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容