黑马程序员——IOS基础(OC面向对象编程二)



一、继承

            继承是面向对象编程技术的一个重要特性,它允许创建分等级层次的类,使用继承可以创建一个通用类,它定义了
     一般特性,该类可以被更具体的类继承,每个具体的类都可以增加一些自己特有的东西。
     继承具有如下特征:
      (1)继承关系是传递的
      (2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
      (3)继承提供了软件复用功能    
          (4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性
       (5)OC 仅支持单重继承

      程序示例:先定义一个ClassA,它包含一个属性和一个方法,属性是一个整型的变量x,方法是用来给这个整型变量
                        设置一个值。ClassA是继承NSObiect类的。
          ClassA.h代码:
                                   #import <Foundateion/Foundation.h>
                                  @interface ClassA : NSObject
                                       { int x;  }
                                      - (void) setX;
                                    @end
           
            ClassA,m代码:
                                   #import "ClassA.h"
                                   @implementation ClassA
                                  -(void) setX
                                     { x = 10; }
                                  @end

            定一个ClassB用于继承ClassA,并定义一个新的方法叫做printX,用于将x的值打印出来
               ClassB,h代码:
                                     #import <Foundateion/Foundation.h>
                                    #import "ClassA.h"
                                     @interface ClassB : ClassA
                                      - (void) printX;
                                     @end
              
               ClassB.m代码:
                                      #import "ClassB.h"
                                      @implementation ClassB
                                       - (void) printX
                                           {  NSLog(@"%i",x);  }
                                      @end
                                      
              以下代码是对定义的类进行测试:
                                      #import "ClassA.h"
                                     #import "ClassB.h"
                                      int main (int argc, const char * argv[ ])
                                     {  NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
                                         ClassB *classB = =[[classb alloc]init];
                                        [classB setX];
                                        [classB printX];
                                        [classB release];
                                        [pool drain];
                                        return 0;
                                     }
                              程序的输出结果为:10

二、方法重写

         方法重写又称方法覆盖,若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数,则新方法将覆 
      盖原有的方法
     将以上继承例子的代码稍作修改:
             ClassA.h代码:
                                #import <Foundateion/Foundation.h>
                                  @interface ClassA : NSObject
                                       { int x;  }
                                      - (void) setX;
                                    @end

             ClassA.m代码:
                                   #import "ClassA.h"
                                   @implementation ClassA
                                  -(void) setX
                                     { x = 10; }
                                  @end

             在ClassB.h中定义一个方法也叫setX
                                     #import <Foundateion/Foundation.h>
                                     #import "ClassA.h"
                                     @interface ClassB : ClassA
                                      - (void) printX;
                                     - (void) setX;
                                     @end
              
                在ClassB.m中添加这个方法的实现
                                       #import "ClassB.h"
                                      @implementation ClassB
                                       - (void) printX
                                           {  NSLog(@"%i",x);  }
                                       - (void)setX
                                            { x = 11;}
                                      @end

               同样在测试类中调用该方法
                                      #import "ClassA.h"
                                     #import "ClassB.h"
                                      int main (int argc, const char * argv[ ])
                                     {  NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
                                         ClassB *classB = =[[classb alloc]init];
                                        [classB setX];
                                        [classB printX];
                                        [classB release];
                                        [pool drain];
                                        return 0;
                                     }
                              程序的输出结果为:11

三、方法重载

     使用方法重载,可以在类中创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义,调用时,通过
传递给它们的不同个数和类型的参数来决定具体使用哪个方法。
      方法重载的规范:方法名一定要相同
                                   方法的参数表必须不同,包括参数的类或个数,以此区分不同的方法体
                                    方法的返回类型、修饰符可以相同,也可以不同
       基于前面的例子,我们给ClassB类增加一个新方法来体会方法重载:
                 - (void) setX:(int)value;
         
        ClassB.h代码:
                                      #import <Foundateion/Foundation.h>
                                     #import "ClassA.h"
                                     @interface ClassB : ClassA
                                      - (void) printX;
                                     - (void) setX;
                                      - (void) setX:(int)value;
                                     @end
        ClassB.m代码:        
                                      #import "ClassB.h"
                                      @implementation ClassB
                                       - (void) printX
                                           {  NSLog(@"%i",x);  }
                                       - (void)setX
                                            { x = 11;}
                                       - (void)setX:(int)value
                                             { x = value; }
                                      @end

         测试代码:
                                      #import "ClassA.h"
                                     #import "ClassB.h"
                                      int main (int argc, const char * argv[ ])
                                     {  NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
                                         ClassB *classB = =[[classb alloc]init];
                                        [classB setX];
                                        [classB printX];
                                        [classB setX:100];
                                        [classB printX];
                                        [classB release];
                                        [pool drain];
                                        return 0;
                                     }

               程序结果为:11    100

           ClassB中有两个setX方法,一个是重写ClassA方法,另一个则是自己定义的。在测试类中调用setX方法,编译器
       会根据是否输入一个参数,而动态选择setX方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值