• OC类的继承


    类的继承

    cmd + →: 光标跳到这一行的最后面

    cmd + ←: 光标跳到这一行的最前面

    cmd + ↑: 光标跳到这一行的最上面

    cmd + ↓: 光标跳到这一行的最下面

    alt + ←: 光标跳过一个单词的最后面

    alt + →: 光标跳过一个单词的最前面

     shift + alt + k: 

     Xcode插件管理器 Alcatra

    安装命令

    Xcode插件管理器 Alcatra

    安装命令

    curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh

            继承: 子类可以继承父类的特征和行为

            OC继承的特点:

            1.单根继承: 只有一个根类(基类), NSObject

            2.单向继承: 每个类只有一个父类, 但可以有多个子类

            继承的好处: 把相同的特征和行为定义在父类中, 子类只需要继承父类就可以拥有这些特征和行为, 子类只需要写自己独有的特征和行为    

            普通僵尸

    Zombie.h
    //继承关系的体现
    @interface Zombie : NSObject {
    //血量, 攻击力, 移动速度
        NSInteger _HP;
        NSInteger _attact;
        CGFloat _speed;
    }
    
    - (void)setHP:(NSInteger)HP;
    - (NSInteger)HP;
    
    - (void)setAttact:(NSInteger)attact;
    - (NSInteger)attact;
    
    - (void)setSpeed:(CGFloat)speed;
    - (CGFloat)speed;
    
    //⾏⾛ 攻击 死亡
    - (void)move;
    - (void)eat;
    - (void)die;
    @end
    Zombie.m
    #import "Zombie.h"
    @implementation Zombie
    
    - (void)setHP:(NSInteger)HP {
        _HP = HP;
    }
    - (NSInteger)HP {
        return _HP;
    }
    
    - (void)setAttact:(NSInteger)attact {
        _attact = attact;
    }
    - (NSInteger)attact {
        return _attact;
    }
    
    - (void)setSpeed:(CGFloat)speed {
        _speed = speed;
    }
    - (CGFloat)speed{
        return _speed;
    }
    
    - (void)move {
        NSLog(@"移动");
    }
    - (void)eat {
        NSLog(@"真是美味");
    }
    - (void)die {
        NSLog(@"挂了");
    }
    @end
    main.m
    普通僵尸
            Zombie *zombie = [[Zombie alloc] init];
            //实例变量
            [zombie setHP:50];
            [zombie setAttact:5];
            [zombie setSpeed:100];
            NSLog(@"%ld %ld %.2lf", [zombie HP], [zombie attact], [zombie speed]);
            //方法
            [zombie move];
            [zombie eat];
            [zombie die];

            路障僵尸

            从父类继承过来的的实例变量(特征)

    RoadZombie.h
    #import "Zombie.h"
    @interface RoadZombie : Zombie {
        //装备
        NSString *_prop;
    }
    - (void)setProp:(NSString *)prop;
    - (NSString *)prop;
    //失去装备
    - (void)lostProp;
    @end
    RoadZombie.m
    #import "RoadZombie.h"
    @implementation RoadZombie
    - (void)setProp:(NSString *)prop{
        _prop = prop;
    }
    - (NSString *)prop {
        return  _prop;
    }
    - (void)lostProp {
         NSLog(@"%@装备掉了", _prop);
        _prop = @"";
    }
    //当从父类继承的方法, 不满足子类的需求时, 重写父类的方法
    //注: 重写父类的方法, 不需要写声明部分
    - (void)move {
        NSLog(@"摩擦,摩擦!");
    }
    @end
     main.m
    RoadZombie *roadZombie = [[RoadZombie alloc] init];
            [roadZombie setHP:70];
            [roadZombie setAttact:7];
            [roadZombie setSpeed:140];       
            NSLog(@"%ld %ld %.2lf", [roadZombie HP], [roadZombie attact], [roadZombie speed]);
            //从父类继承过来的的方法(行为)
            [roadZombie move];
            [roadZombie eat];
            [roadZombie die];  
            //自己独有的
            [roadZombie setProp:@"路障"];
            NSLog(@"%@", [roadZombie prop]);
            [roadZombie lostProp];

            铁桶僵尸

            从父类继承过来的的实例变量(特征)

    DrumZombie.h
    #import "RoadZombie.h"
    @interface DrumZombie : RoadZombie {
        NSString *_weakness;
    }                  
    - (void)setWeakness:(NSString *)weakness;
    - (NSString *)weakness;
    @end
    DrumZombie.m
    #import "DrumZombie.h"
    @implementation DrumZombie
    - (void)setWeakness:(NSString *)weakness {
        _weakness = weakness;
    }
    - (NSString *)weakness {
        return _weakness;
    }
    - (void)move {
        //super: 编译指令, 用于调用父类的方法
        [super move];
        NSLog(@"在光滑的地面上");
    }
    @end
    main.m
    DrumZombie *drumZombie = [[DrumZombie alloc] init];
            [drumZombie setHP:100];
            [drumZombie setAttact:10];
            [drumZombie setSpeed:180];
            [drumZombie setProp:@"铁桶"];
            NSLog(@"%ld %ld %.2lf %@", [drumZombie HP], [drumZombie attact], [drumZombie speed], [drumZombie prop]);
            
            //从父类继承过来的的方法(行为)
            [drumZombie move];
            [drumZombie eat];
            [drumZombie die];
            
            //自己独有的
            [drumZombie setWeakness:@"怕磁铁"];
            NSLog(@"%@", [drumZombie weakness]);
            [drumZombie lostProp];

            NSObject常见的方法

            1.+alloc, 开辟内存空间

            2.-init, 初始化方法(清空操作)

            3.-class, 获取对象的类型

            4.+class, 获取类的类型

            5.isKindOfClass: 判断对像是不是属于某个类

            6.isMemberOfClass: 判断对象是不是某个类的实例(对象)

     Zombie *a = [[Zombie alloc]init];
            NSLog(@"%@", [a class]);
            NSLog(@"%@", [Zombie class]);
            BOOL result = [a isKindOfClass:[zombie class]];
            result = [drumZombie isMemberOfClass: [drumZombie class]];
            NSLog(@"%hhd", result);

            方法调用的机制: 先从自身类中找方法, 如果找到, 就调用, 没有找到, 就去父类中找, 父类没有找到, 就去父类的父类中找, 直到找到方法, 并调用

            系统的init: 清空实例变量的值

            重写init方法: 当需要为实例变量赋初始值时

            自定义初始化方法: 根据外部传入的参数, 为实例变量赋值

    自定义初始化方法

    1.-号方法

    2.返回值是id或者instancetype(id: 相当于void *, 对象类型, 可以代指任意对象类型)

    3.必须以init开头

    4.第一个参数前加with

      - (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender; 

     

    便利构造器

    1.+号方法

    2.返回值是id或者instancetype

    3.必须以类名开头

    4.第一个参数前加with

      + (instancetype)boyWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender; 

    Boy.m
    - (instancetype)initWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender {
        self = [super init];
        if (self) {
            _name = name;
            _age = age;
            _gender = gender;
        }
        return self;
    }
    
    + (instancetype)boyWithName:(NSString *)name age:(NSInteger)age gender:(NSString *)gender {
        //1
    //    Boy *boy = [[Boy alloc] init];
    //    [boy setName:name];
    //    [boy setAge:age];
    //    [boy setGender:gender];
        
        //2
        Boy *boy = [[Boy alloc] initWithName:name age:age gender:gender];
        return boy;
        
        //3
        return  [[Boy alloc] initWithName:name age:age gender:gender];
    
        //注: 2, 3种写法建立在写了自定义初始化方法的基础上
    }
    main.m
     Boy *boy = [[Boy alloc] init];
            NSLog(@"%@", [boy gender]);
            [boy setName:@"李四"];
            [boy setAge:20];
            [boy setGender:@"未知"];
            [boy sayHi];
            
            //自定义初始化方法, 初始化 + 实例变量赋值
            Boy *boy1 = [[Boy alloc] initWithName:@"叶良辰" age:25 gender:@""];
            [boy1 sayHi];
            
            //便利构造器 = 开辟内存空间 + 初始化 + 实例变量赋值
            Boy *boy3 = [Boy boyWithName:@"福尔康" age:38 gender:@"你猜"];
            [boy3 sayHi];

     

    The one who wants to wear a crown must bear the weight!
  • 相关阅读:
    ConcurrentHashMap总结
    HashMap在多线程环境下操作可能会导致程序死循环
    oracle数据库的 to char 和to date 区别(时间格式化)
    SQL中的cast()函数用法
    常见的垃圾收集器有3类-java面试一
    mybatis中sql引用
    mysql find_in_set 查询
    用Redis实现微博关注关系的分析
    C#与C++相比较之STL篇(续一)
    Vite2.0 入门
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4856292.html
Copyright © 2020-2023  润新知