zoukankan      html  css  js  c++  java
  • OC学习笔记 面向对象 继承与组合

    一、基本概念

    程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量)。

     在这里动物是猫类和狗类的父类,黑猫和白猫类是猫类的子类。

    继承的好处:

    (1)抽取出了重复的代码

    (2)建立了类和类之间的联系

    继承的缺点:

    耦合性太强

     

    二、OC中的继承

    @interface Animal:NSObject

    //动物里继承了NSObject,获得NSObject类的方法;

    @end

     

    @interface Dog :Animal

    //dog类继承Animal类

    @end

    注意:OC语言是单继承语言。在oc语言中,基本上所有类的根类都是NSObject类。

     

    三、继承的使用注意

    (1)编译器从上往下执行,所以在子类前面至少应该要有父类的声明;

    (2)OC中不允许子类和父类拥有相同名称的成员变量名;

    (3)OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果没有则一层一层的往上找;

    提示:重写即子类重新实现了父类中的某个方法,覆盖了父类以前的实现。

    示意图:一共有三个类,Person类继承了NSObject类,Student类继承了Person类。

    创建一个Student *s=[[Student alloc] init];

    此时会把Student类和这个类的父类加载进内存。

    提示:每个类中都有一个super class指针,该指针指向自己的父类。对象中有一个isa指针,该指针指向调用该对象的类。

     

    四、继承和组合

    继承的适用场合:

    (1)当两个类拥有相同的属性和方法时,就可以将相同的属性和方法抽取到一个父类中。

    (2)当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类(考虑),在这种情况下,也可以考虑使用组合。

      继承:###是xxx,如狗是动物,可以让狗继承动物类

    组合:###拥有xxx,如学生有书,可以让书这个类作为学生类的属性

    继承有两缺点:

    (1)当层级越来越多时,假如每个层级都有实例变量,那么最下层的子类继承的实例变量会超级多,沉重;

    (2)当消息传递自子类往上时,层级越多,效率越低下。

    所以就有了组合。说实话区分继承和组合真不是那么容易。所谓两者是“is a"关系则是继承,两者是"has a"则是组合,还是模糊。

    其实,这两个概念无须区分十分明显,只需要记住:a)组合和继承实现的功能差不多,但是实现的形式不一样,记住各自的形式即可;b)尽量用组合。

    五、关键字super

    Super关键字,在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。

    作用:

    (1)直接调用父类中的某一个方法

    (2)Super处在对象方法中,那么就会调用父类的对象方法;super处于类方法中,那么就会调用父类的类方法。

    使用场景:子类在重写父类方法时,想要保留父类的一些行为。

     

    六、OC中所有的函数都是虚函数,函数的重写可实现多态性。

    不同的(相近的)事物,在经过同一事件触发时,产生不同的结果or响应,调用函数时,不看指针看对象。父类的指针可以指向子类的对象。

     

     1 #import <Foundation/Foundation.h>
     2 /*
     3  *继承 好处:1抽取重复代码 2建立类之间的关系 3子类可以拥有父类的所有方法和变量
     4  重写:函数的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。
     5  重写之后,父类的对象调用父类的方法;子类的对象,调用子类的方法。不会引起冲突。从父类继承的方法,不适用于子类时,可以直接声明父类的同名函数,并定义。不用考虑父类中,函数已存在的问题。重写后,子类就不能调用父类的方法。
     6  */
     7 //父类
     8 @interface animal : NSObject
     9 {
    10     int  _Age;
    11     double _Weight;
    12 }
    13 - (void)setAge : (int)age;
    14 - (int)age;
    15 - (void)setWeight : (int)weight;
    16 - (double)weight;
    17 - (void)run;
    18 @end
    19 
    20 @implementation animal
    21 
    22 - (void)setAge : (int)age{
    23     _Age = age;
    24 }
    25 - (int)age
    26 {
    27     return  _Age;
    28 }
    29 - (void)setWeight : (int)weight;
    30 {
    31     _Weight = weight;
    32 }
    33 - (double)weight
    34 {
    35     return  _Weight;
    36 }
    37 -(void)run
    38 {
    39     NSLog(@"跑跑跑");
    40 }
    41 @end
    42 
    43 @interface dog : NSObject
    44 //animal *_animal;组合
    45 @end
    46 @implementation dog
    47 @end
    48 
    49 @interface cat : animal
    50 @end
    51 @implementation cat
    52 - (void)run
    53 {
        [super run];//调用父类方法
    54 NSLog(@"喵喵跑");//重写父类方法 55 } 56 @end 57 58 int main() 59 { 60 dog *d = [dog new]; 61 //[d run]; 62 [d setAge : 5]; 63 [d age]; 64 cat *c = [cat new]; 65 [c run]; 66 return 0; 67 }

    super 处于对象方法中时 那么就会调用父类对象方法

    super 处于方法时就会调用父类的类方法

     适用场合:子类重写父类方法时想保留父类的一些行为。

  • 相关阅读:
    Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
    Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
    Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
    Civil 3D 二次开发 新建CLR项目出现错误C2143
    Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
    了解AutoCAD对象层次结构 —— 6 ——块表记录
    datepicker97使用
    使用angular 外接 templateUrl,使用ng-include
    angularJs 遮罩
    网上找的有关css兼容问题
  • 原文地址:https://www.cnblogs.com/zhangdashao/p/4442544.html
Copyright © 2011-2022 走看看