zoukankan      html  css  js  c++  java
  • 【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;
    }



  • 相关阅读:
    文本中溢出的文字在结尾显示为三个点
    git bash 如何建分支
    git本地仓库和远程仓库连接
    button不能直接添加href属性实现页面跳转
    【JAVA】【集合9】ArrayList和Vector区别
    【JAVA】【集合8】Java中的Vector
    【JAVA】【集合7】Java中的ArrayList
    【JAVA】【集合6】Java中的Collections工具类
    【JAVA】【集合5】Java中的List接口
    【JAVA】【集合4】Java中的Collection接口
  • 原文地址:https://www.cnblogs.com/shujucn/p/7481468.html
Copyright © 2011-2022 走看看