首页 > 代码库 > Objective-C:04_面向对象-三大特性

Objective-C:04_面向对象-三大特性

三大特性:封装、继承、多态

 
封装:
    成员变量的封装
 
    为了过滤不合法的属性值,我们需要提供一个方法给外界设置age属性值
        set方法
            作用:提供一个方法给外界设置成员变量值
            命名:方法名必须以set开头
                      set后面跟上成员变量的名称,成员变量的首字母必须大写
                       返回值一定是void
                      一定要接收一个参数,而且参数类型跟成员变量类型一致
                      形参变量的名称不能和成员变量一样
        get方法:
            作用:返回对象内部的成员变量的值
            命名规范:
                肯定有返回值,返回值类型肯定与成员变量类型一致
                方法名跟成员变量名一样
                不需要接收任何参数
 
 
        成员变量尽量不要用@public
 
    枚举定义方法:
        typedof enum{
            SexMan,
            SexWoman
        }Sex;
 
    成员变量的命名规范:一定要以下划线 _开头
               作用:
                    1、让成员变量和get方法的名称区分开
                    2、也可以和局部变量区分开,一看到下划线开头的变量,一般都是成员变量
 
    
OC本质上还是C语言,本质上还是面线过程的。还是弱语法
   没有声明没有实现:
     调用没有声明的方法编译的时候只有警告。
    只会在运行的时候报错:
    -[Person test]: unrecognized selector sent to instance 0x7fe9804076a0:
        给Person对象发送了一个不能识别的消息:test
 
  有声明没有实现:
    如果对象声明了一个方法,但是没有实现,编译的时候同样不会报错,只会有警告。只有在执行的时候会报错(错误和上面的一样)。
    OC是在运行过程中才会检测对象有没有实现相应的方法(动态检测)
 
 没有声明有实现:
    这样写的话没有警告,也不会报错。
 
    程序在运行过程中出错将会闪退。
 
类方法:
    类方法都是以加号(+)开头
    然后调用的时候直接使用类名调用[Person printClassName];
    
    类方法只能使用类名调用,不能使用对象调用。
    允许类方法的方法名和对象方法的方法名相同
    在类方法中不能访问实例变量
    
    对象方法:
        -》减号 - 开头
        -》只能有对象来调用
        -》对象方法中能访问当前对象的成员变量(实例变量)
    类方法:
        -》加号 + 开头
        -》只能由类(名)来调用
        -》在类方法中不能访问实例变量
    
    类方法的好处和使用场合:
        -》不依赖于对象,执行效率高
        -》能用类方法尽量用类方法
        -》场合:当方法内部不需要使用到成员变量时,就可以改为类方法
    
工具类:
        基本没有任何成员变量,里面的方法基本都是类方法。
    
self关键字
    self:谁调用了当前方法,self就代表谁(self如果出现在对象方法中,self代表对象。self如果出现在类方法中,self就代表类)
    当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
    用self访问成员变量,区分同名的局部变量
    可以利用"self->成员变量名"访问当前对象内部的成员变量
    可以利用[self 方法名];调用其他的对象方法\类方法
    self不管是在类方法还是对象方法中,如果调用自己,那么就会形成死循环
    在类方法中的self不能调用对象方法,对象方法中的self不能调用类方法
    self不能调用函数
 
 
继承:
    继承的好处:
        1、抽取重复代码
        2、建立了类之间的关系
        3、子类可以拥有父类中的所有成员变量和方法
    注意点:
        基本上所有类的根类是NSObject
        如果写在同一个文件中,那么父类必须s要写在前面
        OC中不允许子类和父类拥有相同名称的成员变量
        子类重新实现父类的某个方法,不需要像C#中的需要关键字
        调用某个方法时,优先去当前类中找,如果找不到,就去父类中找
 
        每个类中都有一个superclass指针,指向该类的父类
 
      继承的坏处:耦合性太强了。
        所以继承不能乱用
    
    继承的使用场合:
        1、当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
        2、当A类拥有B类中的部分属性和方法时,可以考虑让B类继承A类
    
        继承:xx是xxx
        组合:xxx拥有xxx
    组合:(学生继承成绩,在逻辑上不通,这时候就可以使用组合)
        @interface Score : NSObject
        {
            int _cScore;
            int _ocScore;
        }    
        @end
 
    @implementation Score
    @end
 
    @interface Student:NSObject
    {
        Score *_score;//这种方式就是组合
        int _age;
    }
    @end
    @implementation Student
    @end
 
super:
        调用父类的方法。(在重写父类的test方法中想调用父类的test方法或者其他方法,使用[super 方法名])
        super处在对象方法中,那么就会调用父类中的对象方法
        super处在类方法中,那么就会调用父类中的类方法
    
    使用场景:
        子类重写父类的方法时,想保留父类的一些行为
        
多态
    
    父类指针指向子类对象
    
    没有继承就没有多态
    代码的体现:父类类型的指针指向子类对象
    好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
    局限性:
        父类类型的变量,不能直接调用子类特有的方法,必须强转成子类类型变量后,才能直接调用子类特有的方法。
        
 
    调用方法的时候会检测对象的真实形象
    
    如果参数中使用的是父类类型,可以传入父类、子类对象
  
多态的局限性:父类类型的变量,不能用来调用子类的方法。 
    Dog类继承自Animal类
    Animal  *aa=[Dog new];
    Dog  *dd=(Dog *)aa;//强制类型转换,将aa转换成Dog *类型的变量
 
 
 
    
 
 
 如果有不对的地方请大家指正!!

Objective-C:04_面向对象-三大特性