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 }
  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/liuguan/p/4902786.html
Copyright © 2011-2022 走看看