美文网首页
05-面向对象语法-继承

05-面向对象语法-继承

作者: SnorlaxSE | 来源:发表于2017-09-11 22:37 被阅读0次

    1.继承的好处

    1> 抽取重复代码
    2> 建立了类与类之间的关系
    3> 子类拥有了父类中的所有成员变量和方法
    

    2.继承的坏处

    耦合性太强,子类与父类必须相互依存(如果将父类的代码 删除了,子类也不能正常使用);
    

    3.继承注意点

    1> 基本所有类的根类是NSObject;
    2> 父类的声明必须写在子类前面,实现无所谓;
    3> 不允许子类有和父类相同的成员变量;
    4> 调用某个方法时,优先在当前类中找,找不到就会去父类中找(内存分析见下图);
    5> 允许子类中有和父类相同的方法,即:重写(子类重新实现父类中的某个方法,这是在子类中调用该方法就会优先执行子类中重新实现的方法,覆盖父类以前的方法);
    

    4.继承的使用场合

    1> 当两个类拥有相同属性和方法时,就可以将相同的东西抽取到一个父类中;
    2> 当A类中完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类;
    
    注意:
    1.并不是只要有相同的属性和方法就可以使用继承;
    2.使用继承时要考虑这两个类是否存在逻辑上的关系;
    3.如果不存在逻辑关系,就用组合;
    继承: xxx 是 xxx
    组合: xxx 拥有 xxx
    

    代码一:

    #import <Foundation/Foundation.h>
    
    /*********Animal类的声明**********/
    @interface Animal : NSObject
    {
        int _age;
        double _weight;
    }
    
    - (void)setAge:(int)age;
    - (int)age;
    @end
    
    /*********Animal类的实现**********/
    @implementation Animal
    - (void)setAge:(int)age
    {
        _age = age;
    }
    - (int)age
    {
        return _age;
    }
    @end
    // : Animal 代表Dog类继承了Animal类,那么Dog类中就拥有了Animal类中的所有成员变量及方法
    // Animal类就是Dog类的父类
    // Dog类就是Animal的子类
    
    /*********Dog类的声明**********/
    @interface Dog : Animal
    
    @end
    
    /*********Dog类的实现**********/
    @implementation Dog
    
    @end
    
    int main()
    {
        Dog *d = [Dog new];
        
        [d setAge:10];
        
        NSLog(@"age=%d", [d age]);
        
        return 0;
    }
    
    04-继承.m.png

    代码二:

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    {
        int _age;
    }
    
    - (void)run;
    @end
    
    @implementation Person
    - (void)run
    {
        NSLog(@"person---跑");
    }
    @end
    
    // 注意点1:子类的声明必须写在父类的声明后面
    @interface Student :Person
    {
        int _no;
    // 注意点2:不允许在子类中有和父类相同的成员变量
        // int _age; // 报错:重复定义_age(error: duplicate member '_age')
    }
    
    // - (void)run; // 这里可以不写,因为在其父类中已经有声明,如果子类实现中有该方法的实现,就是重写(子类重新实现父类中的某个方法)
    @end
    
    @implementation Student
    // 重写:子类重新实现父类中的某个方法,这是在子类中调用该方法就会优先执行子类中重新实现的方法,覆盖父类以前的方法
    - (void)run
    {
        NSLog(@"student---跑");
    }
    @end
    
    int main()
    {
        Student *s = [Student new];
        
        [s run]; // 会现在子类中找run方法,找到了就优先执行当前类中run方法,没有找到就会去其父类中找
        
        return 0;
    }
    
    05-继承的使用注意.png

    代码三:

    #import <Foundation/Foundation.h>
    
    @interface Score : NSObject
    {
        int _cScore;
        int _ocScore;
    }
    @end
    
    @implementation Score
    
    @end
    
    // 继承:xx 是 xxx
    // 组合:xx 拥有 xxx
    
    @interface Student :NSObject
    {
        int _no;
        int _age;
        Score *_score; // 这里用的就是组合
    }
    
    @end
    
    @implementation Student
    
    @end
    
    int main()
    {
        
        return 0;
    }
    

    原文:http://www.cnblogs.com/unique-ios/p/4322564.html

    相关文章

      网友评论

          本文标题:05-面向对象语法-继承

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