• 【Object-C】多态


    Object-c 里面的指针类型有两种
    1、编译时的类型,由申明该变量时使用的类型决定
    2、运行时的类型,由运行时实际付给该变量的对象决定

    如果编译时和运行时的类型不一致,就可能出现多态(Polymorphism)。
    #import <Foundation/Foundation.h>
    @interface DCBase : NSObject
    -(
    void) base ;
    -(
    void) test ;
    @end

    @interface DCSubclass : DCBase
    -(void) test ;
    -(void) sub ;
    @end

    #import "DCBase.h"
    @implementation DCBase
    -(void) base
    {
       
     NSLog(@"父类的普通base方法");
    }
    -(void) test
    {
       
     NSLog(@"父类将被覆盖的test方法");
    }
    @end


    @implementation DCSubclass

    - (
    void) test
    {
       
     NSLog(@"子类的覆盖父类的test方法");
    }
    - (void) sub
    {
       
     NSLog(@"子类的sub方法");
    }
    @end

    //
    //  main.m
    //  Polymorphism
    //
    //  Created by mac on 14-11-29.
    //  Copyright (c) 2014 mac. All rights reserved.
    //

    #import <Foundation/Foundation.h>
    #import
     "DCBase.h"
    #import
     "DCSubclass.h"

    int main(int argc, const char * argv[]) {
       
     @autoreleasepool {
           
     // insert code here...
           
     NSLog(@"Hello, Polymorphism!");
          
           
     DCBase* bc = [[DCBase alloc] init];
           
     // 下面两次调用将执行BaseClass的方法
            [bc
     base];
            [bc
     test];
           
     // 下面编译时类型和运行时类型完全一样,因此不存在多态
           
     DCSubclass* sc = [[DCSubclass alloc] init];
           
     // 下面调用将执行从父类继承到的base方法
            [sc
     base];
           
     // 下面调用将执行子类重写的test方法
            [sc
     test];
           
     // 下面调用将执行子类定义的sub方法
            [sc
     sub];
           
            // 下面编译时类型和运行时类型不一样,多态发生.编译时类型为DCBase,运行时类型则
                    //是DCSubclass,调用该对象的test方法时
            //实际调用了DCSubclass中的test方法。
           
     DCBase* ploymophicBc = [[DCSubclass alloc] init];
           
     // 下面调用将执行从父类继承到的base方法
            [ploymophicBc
     base];
           
     // 下面调用将执行子类重写的test方法
            [ploymophicBc
     test];
           
           
     // 因为ploymophicBc的编译类型是DCBase
           
     // DCBase类没有提供sub方法,所以下面代码编译时会出现错误。
            [ploymophicBc
     sub];
           
           
     // 可将任何类型的指针变量赋值给id类型的变量
           
     id dyna = ploymophicBc;
            [dyna
     sub];
           
     id mba = sc ;
            [mba
     sub];
           
           
        }
       
     return 0;
    }



  • 相关阅读:
    如何选择开源许可证?(转)
    gdb的使用(转)
    git的使用
    2017-3-13 leetcode 4 11 15
    2017-3-12 leetcode 167 209 216
    2017-3-11 leetcode 217 219 228
    2017-3-10 leetcode 229 238 268
    1175: 零起点学算法82——find your present
    1174: 零起点学算法81——求整数绝对值
    1173: 零起点学算法80——求实数绝对值
  • 原文地址:https://www.cnblogs.com/shujucn/p/7481468.html
Copyright © 2020-2023  润新知