美文网首页
Objective-C的动态性、多态性、重载

Objective-C的动态性、多态性、重载

作者: 慢慢变好中 | 来源:发表于2019-03-20 21:34 被阅读0次

1.动态性:

OC的动态性具体是指利用id类型(动态类型)的指针指向任意一个对象,此时对象的类型在编译期不做类型检查,它可以是任何类型,而在运行时确定它的类型,它运行时的类型一般来说为你赋给它的类型,在运行时类型确定好后,相关的方法也就绑定好了。比如:id temp=[[NSString alloc]init];此时temp对象的类型是任意的,你可以编写[temp mehthod],不管这个temp的具体类型到底能不能接受这个method,因为在编译期都不会做检查,所以编译就会通过,你可以将method设置为属于UILabel的settext:方法---这个NSString没有的方法。但是当代码具体运行到这里的时候,会报错,显示为不能识别的method,即temp无法响应这个方法,因为运行时这个temp对象是一个NSString对象,非UILabel对象,所以无法响应settext:方法,如果将method改成一个NSString有的方法,就没什么问题了。

另外,如果编写这样的代码:

NSString *str=[[UIButton alloc]init];

在编译的时期,会给出类型不匹配的警告,此时调用[str  length]方法会引发警告:“str可能无法响应length方法”,即UIButton对象可能无法响应length方法,运行一下,出现报错--str无法响应length这个属于NSString的方法。在编译的时候,编译器会吧str认为是一个NSString对象,在后面编写给str发送属于NSString的方法也会编译通过,但是到了运行时阶段,str对象实际是一个UIButton对象,它无法响应length方法,所以运行时会出现错误。

如果将length换成一个UIButton对象的方法,那么直接出现编译不通过,因为此时编译器将str认为是一个NSString对象,认为它无法响应这个不属于自己的方法。

注:编译期:是指在代码编写阶段,编译期对代码进行基本的检查报错--语法分析、词法分析等。

        运行时:通过编译这一关后,将编译好的代码装载到内存中运行起来的阶段,这个时候会进行类型检查,不仅仅是对代码进行简单检查,此时出错会导致崩溃的产生。

2.多态性

多态性是面向对象语言的一般性,是指不同对象对同一方法对不同响应方式,通常是用父类的指针指向各种子类的对象,不同的子类对象对继承自父类的某一方法进行各自的重写,从而实现对同一方法对不同实现:

比如此时有一个A父类,它有BCD三个不同的子类,三个子类分别对父类中的speak方法(其他语言可能成为函数)进行了各自的覆写,A的的speak方法中可以设置NSLog(@"A"),而子类覆写speak方法各自输出自己类别,当给不同类别的对象发送speak消息的时候。B、C、D对象各自NSLog输出B、C、D。

但是OC中也可以利用id指针指向不同的对象,从而代替父类的存在而实现多态性,此时不同对象都能响应此方法,但各自实现细节不同;

3.重载

重载是指,支持定义函数名相同,但是函数参数个数不同、参数类型不同的不同函数,它只和类内部有关,是横向的,而继承是父子类间的,是纵向的。OC基本不支持重载,它仅仅支持参数个数不同的重载。比如方法-(int )get:(int)a and:(int)b;方法和-(int)get:(int)a;就是参数个数不同的重载,其实这个时候,两个方法的方法名已经不相同了,去除参数类型后一个为get:and:,一个为get:,OC之所以仅仅支持参数个数不同的重载,是因为OC调用具体方法的时候是用@selecter来取方法名,一个@selector()得到方法名是一个SEL类型的结构体数据类型,每个方法名得到的SEL数据具有唯一性,方法的SEL数据是被放在一个SET集合中的,印证了SEL结构数据的唯一性。

相关文章

  • Objective-C的动态性、多态性、重载

    1.动态性: OC的动态性具体是指利用id类型(动态类型)的指针指向任意一个对象,此时对象的类型在编译期不做类型检...

  • 2020-02-20 Java 面向对象的多态性

    1.多态性的体现: 方法的重载和重写 对象的多态性 2.对象的多态性: 向上转型:程序会自动完成。...

  • java中实现多态的机制

    方法的重写和重载是Java多态性的不同表现. 重写Overriding是父类与子类之间多态性的一种表现 重载Ove...

  • 面向对象-多态性

    /* 面向对象的特征三:多态性 1.多态性指的是什么?多态性,可以理解为一个事物的多种表型形态。 1)方法的重载与...

  • 2019-08-27

    Javascript的多态性 1.js不支持重载 /*****************说明js不支持重载*****...

  • 多态性--java10

    面向对象的特征三:多态性 1、多态性指的是什么?多态性,可以理解为一个事物的多种表现形态。 1)方法的重载与重写 ...

  • 重写与重载的区别

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一...

  • C++第六篇多态

    C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现编译、连接...

  • Java重写与重载

    方法的重写和重载是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式...

  • Java的重载与覆盖,傻傻分不清!

    重载和覆盖是JAVA多态性的不同表现方式,其中重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法...

网友评论

      本文标题:Objective-C的动态性、多态性、重载

      本文链接:https://www.haomeiwen.com/subject/gtxxvqtx.html