美文网首页人生几何?
OC基础-面向对象的三大特征(四)

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

作者: 浮华_du | 来源:发表于2021-08-26 14:48 被阅读0次

    封装,继承,多态

    封装

    • 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
    
    

    相关文章

      网友评论

        本文标题:OC基础-面向对象的三大特征(四)

        本文链接:https://www.haomeiwen.com/subject/cgcpmltx.html