OC基础——封装、继承、多态

来源:互联网 发布:中文移动域名有用吗 编辑:程序博客网 时间:2024/05/16 08:00




一. 成员变量的封装
     优点:外界无法随意修改类中成员变量的值,把内部变量隐藏起来,提高了程序的安全性。    
1、 set方法
 作用:1> 提供一个方法给外界用来设置成员变量值;
          2> 可以在方法里面过滤掉一些不合理的值。
 命名规范:1>  方法名必须以set开头;
                2>  et后面跟上成员变量的名称,成员变量的首字母必须大写;
                3>  返回值一定是void;
                4>  一定要接收一个参数,而且参数类型跟成员变量类型一致;
   eg: 
       -(void)setAge:(int)age
       {
            _age=age;
       }  
 方法调用时和普通方法调用一样:[执行者  方法]
     eg:[p setAge:10];

2、get方法
作用:返回对象内部的成员变量。
命名规范:1> 肯定有返回值,返回值类型肯定和成员变量的类型一致。
               2> 方法名跟成员变量名一致。
               3> 不需要接收任何参数。
 eg:
  -(int)age
  {    
     return _age;
  } 
方法调用和普通方法调用一样:[执行者 方法];
eg: int age = [ p age];
3、弱语法
1> 在C语言中,随便调用一个函数,只要语法对,编译器只会警告,不会报错,只是在链接的时候报错;
2> 在OC语言中,随便调用一个方法,编译器只会警告,不会报错,也可以链接成功,只是在运行时发生错误,经典错误信息如下:

提示错误:指针并未找到相应的方法(给对象Person发送了一个不能识别的方法test()
3> 一旦程序在运行中出错,就会闪退。
4、类方法(类调用、”+“开头、不能访问成员变量)
1、方法分为两种:对象方法和类方法
对象方法:1> 减号“-”开头;
                2> 只能由对象来调用;
                3> 对象方法中能访问当前对象的额成员变量。
类方法: 1> 以加号”+“开头;
              2> 只能由类来调用;
              3> 类方法中不能访问成员变量。
2、类方法的好处
1> 不依赖于对象,执行效率高;
2> 能用类方法,尽量用类方法;
3、 使用场合:当方法内部不需要使用到成员变量的时候,就可以改为类方法。
4、 在一个类中不可以同时存在两个同名的类/对象方法,但是可以同时存在同名类方法和对象方法。
 eg:-(viod)test;
        +(viod)test; // 可以 

5、self关键字
1. self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境:
self出现在对象方法中,self就代表对象;
self出现在类方法中,self就代表类。
2. self的用途:
    1>可以利用”self ->成员变量名“访问当前对象内部的成员变量;
    2>[self 方法名]可以调用其他对方法或类方法。
3. self容易引发死循环。

二、继承(英文:)
1、若类A继承类B,则B拥有A的所有东西(成员变量及方法)。此时称:类A是类B的父类,类B是类A的子类。
特点:子类一旦继承了父类,则子类拥有父类中所有的成员变量和方法。
优点:1>抽取重复代码;
          2>建立类之间的关系;
          3>子类拥有父类中所有属性和方法。
缺点:耦合性强(父类的改变会影响到子类,如果一个类丢失,另外一个类也将不能使用)。

2、注意点:1> 基本上所有类的根类是NSObject;
                  2> 子类和父类不能定义相同的成员变量;
                  3> 允许子类和父类有相同的方法,调用某个对象的方法时,会优先调用子类的方法,然后再去父类中找。(一层一层往上找)
                  4> 父类必须申明在子类前面(只要申明在前就可以了,方法可以写在后面)
                  5> 每个类中都有一个superclass指针,指向自己的父类。
eg:@interface Student:Person


3、组合与继承
继承:xxx是xx,比如student是person(同一种类型范畴);
组合:xxx拥有xx,比如student拥有Score
@interface Student :NSObject{        Score *_Score;//Score是另外一个类,Student类与Score类组合,Student拥有Score类的成员}@end

4、Super关键字
作用:1> 可以直接调用父类中的方法;
          2> 如果super处在对象方法中,就会调用父类的对象方法;
               如果super处在类方法中,就会调用父类中的类方法。
使用场合:子类重写父类的方法时想保留父类的一些行为。(子类可以直接调用父类的某个方法[super 方法名])
eg:在重写父类的基础上,再保留父类的方法:
-(void)walk //重写父类的walk方法{      NSLog("往前走几步");      [super walk]; //调用父类的walk方法}

三、多态(多种形态,父类指针指向子类对象
1、概念:某一类事物的多种形态。比如狗可以有多个形态,一是以狗的形式存在,二是以动物的形式存在。
2、条件:一定要有继承,没有继承就没有多态。
eg:Animal *a = [dog new]; // Animal是父类,dog是子类,狗是动物。
       Dog *d = [Animal new]; //错误,因为动物不一定是狗也可能是猫。
3、优点:节省代码,提高效率。
eg:
//如果方法或函数参数中使用的是父类类型,则可以通过父类指针传入父类和子类对象。viod feed(Animimal *a) //定义喂动物的函数{   [a eat];}// 解析:上述函数的形参是父类Animal,所以函数可以传入父类和子类。这样的话狗和猫都能使用feed函数,节省代码。
4、局限性:父类类型的指针不能调用子类的方法(必须将父类指针强制转换为子类指针时才能调用子类中的方法)。
eg:
//Dog有一个run方法int main(){    Animal *a = [Dog new];    [a run];//编译时会警告,但是可运行,不建议这样写。    Dog *d = (Dog*)a;// 将父类指针a强制转换成子类指针d    [d run];}
总之:1> 没有继承就没有多态;
           2> 代码体现:父类类型的指针指向子类对象;eg:Animal *a = [Dog new];
           3> 好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象;
           4> 局限性:父类类型的变量,不能直接调用子类特有的方法。必须强制转换为子类类型变量后,才能直接调用子类特有的方法。

四、OC字符串
1、创建OC字符串的方法
1> NNString *str = @"itcoast";// oc字符串以@开头
2> NNString *str = [NSString stringWithFomat:@"my age is %d,number is %d",age,no];

2、长度算法:[str length]// 直接调用NSObject中的length方法,length方法计算的是字数(包括空格),并不是字符数。
      eg: “哈哈Jack”字数为6个字(汉字和字母一样都算一个字)
      占位符:%@

0 0