zoukankan      html  css  js  c++  java
  • Objective 多态

    多态的特点

    1、没有继承就没有多态

    2、代码的体现:父类类型的指针指向子类对象

    3、好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

    4、局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

    Graphics(图形)的类声明

    1 @interface Graphics : NSObject
    2 -(void)prin;
    3 @end

    Graphics(图形)的类实现

    @implementation Graphics
    -(void)prin
    {
        NSLog(@"打印图形的面积");
    }
    @end

    Triangle(三角形)、Rectangular(矩形)的类实现,在这里对三角形和矩形的prin方法进行了重写,不需要在声明,直接实现,

    1 @interface Rectangular : Graphics
    2 
    3 @end
    1 @interface Triangle : Graphics
    2 
    3 @end
    @implementation Triangle
    -(void)prin //方法重写
    {
        NSLog(@"打印三角形的面积");
    }
    @end
    @implementation Rectangular
    
    -(void)prin //方法重写
    {
        NSLog(@"打印矩形的面积");
    }
    @end

    下面定义一个People(人)的类,在其中实现了多态,其中矩形和三角形都为图形,Graphics *指向子类的对象在这里实现了代码的简化(矩形和三角形继承了图形)。

    简而言之,多态就相当于C语言中的具有形参的函数,就像下面代码中的c,c是一个Graphics(图形)的指针类型,那么Triangle(三角形)、Rectangular(矩形)的对象就都可以传入进来。调用的时候直接改变参数就可以了

    @implementation People
    
    -(void)calculate:(Graphics *)c
    {
        [c prin];
    }
    @end

    主程序代码如下

     1 #import "Graphics.h"
     2 #import "People.h"
     3 #import "Triangle.h"
     4 #import "Rectangular.h"
     5 #import "Circular.h"
     6 
     7 int main(int argc, const char * argv[]) {
     8     @autoreleasepool
     9     {
    10         Triangle *triangle = [[Triangle alloc] init]; //Triangle(三角形)类型指针指向Triangle类型对象
    11         [triangle prin];  //Triangle类对象调用对象方法
    12         
    13         //多态
    14         //父类指针指向子类对象
    15         Graphics *graphics = [[Rectangular alloc] init];
    16         //注意这里调用的是哪个方法
    17         [graphics prin]; //动态监测--调用方法时会检测对象的真实性
    18         //注意:父类类型的指针变量不能直接调用子类特有的方法(prin是共有的)
    19         Graphics *graphics1 = [[Graphics alloc] init];
    20         [graphics1 prin];
    21         NSLog(@"-------");
    22         Circular *circular = [[Circular alloc] init];
    23         People *people = [[People alloc] init];
    24         [people calculate:graphics];
    25         [people calculate:triangle];
    26         [people calculate:circular];
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    嵌入式网络设备一次盲点补报的开发经验(二)
    嵌入式网络设备一次盲点补报的开发经验(一)
    调试lcd时候给linux单板移植tslib
    java 常用的解析工具
    快速上手 Echarts
    alibaba/fastjson 之 JSONPath
    CentOS 7.5 安装Docker 教程
    Java问题-java进程占用内存过高,排查原因
    zabbix问题-cannot create IPC key for path
    rsync服务-部署配置与维护
  • 原文地址:https://www.cnblogs.com/liuguan/p/4902786.html
Copyright © 2011-2022 走看看