黑马程序员------OC面向对象之多态

-----iOS培训、Android培训、Java培训,期待与您交流-----

一、多态的基本概念

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object
Pascal和C++中都是通过虚函数(Virtual Function) 实现的,而OC中没有多继承也就无需虚函数的概念,OC中的多态是通过简单的继承来体现的。

简单说:就是一个对象对应着不同类型. 

多态在代码中的体现:

父类或者接口的引用指向其子类的对象。

多态的好处:

提高了代码的扩展性,前期定义的代码可以使用后期的内容。

多态的弊端:

前期定义的内容不能使用(调用)后期子类的特有内容。

多态的前提:

1,必须有关系,继承,实现。

2,要有覆盖。 

二、多态在代码中演示

首先,我们先创造一个 子父类的继承关系,父类:Animal,子类:Dog、Cat;

如图所示:

Animal类:

// 动物
@interface Animal : NSObject
- (void)eat;
@end

@implementation Animal
- (void)eat
{
    NSLog(@"Animal-吃东西----");
}
@end

Dog类:

// 狗
@interface Dog : Animal
- (void)run;
@end

@implementation  Dog
- (void)run
{
    NSLog(@"Dog---跑起来");
}
- (void)eat
{
    NSLog(@"Dog-吃东西----");
}
@end

Cat类:

// 猫
@interface Cat : Animal

@end

@implementation Cat
- (void)eat
{
    NSLog(@"Cat-吃东西----");
}
@end

测试程序:

#import <Foundation/Foundation.h>

// 这个函数是专门用来喂动物,狗吃东西
//void feed(Dog *d)
//{
//    [d eat];
//}
//
//void feed2(Cat *c) // 猫吃东西
//{
//    [c eat];
//}
//

// 如果参数中使用的是父类类型,可以传入父类、子类对象
void feed(Animal *a)
{
    [a eat];
}

int main()
{
    // NSString *d = [Cat new];
    // [d eat];

    /*
    Animal *aa = [Dog new];
    // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
    //[aa run];

    // 将aa转为Dog *类型的变量
    Dog *dd = (Dog *)aa; // Dog乃

    [dd run];
    */

    /*
    Animal *aa = [Animal new];
    feed(aa); // 调用动物的吃方法

    Dog *dd = [Dog new];
    feed(dd); // 调用狗的吃方法

    Cat *cc = [Cat new];
    feed(cc); // 调用猫的吃方法
     */

    /*
    // NSString *s = [Cat new]; // Cat非NSString之子类,不可引用
    Animal *c = [Cat new];

    NSObject *n = [Dog new]; // NSObject乃所有OC对象的父类,可引用
    NSObject *n2 = [Animal new];

    // 多种形态
    //Dog *d = [Dog new]; // Dog类型

    // 多态:父类指针指向子类对象
    Animal *a = [Dog new];

    // 调用方法时会检测对象的真实形象
    [a eat];
    */
    return 0;
}

注意点:

如果我们想调用猫或者狗的 “吃” 方法,我们可以能会书写如下代码:

 这个函数是专门用来喂动物,狗吃东西
void feed(Dog *d)
{
    [d eat];
}

void feed2(Cat *c) // 猫吃东西
{
    [c eat];
}

但这个代码不优雅,可以说很烂,我们通过上面的代码知道,Dog类中有- (void) eat 方法,Cat类中有 - (void) eat方法,但这个两个类中的eat方法均是抽取自Animal类,如果我们通过改变形参的方式,来简化代码,这是多态的用武之地了。

// 如果参数中使用的是父类类型,可以传入父类、子类对象
void feed(Animal *a)
{
    [a eat];
}

当然,这里可能看起来差不多,但我们试想,如果一个项目中,一个函数不可能这么简单,在大项目中使用多态的手段,那么代码量将会减少很多,也会减少很多无用的冗余代码,代码看起来也很优雅~

三、总结

1.没有继承就没有多态

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

3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

4.局限性:

1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法

如:

 Animal *aa = [Dog new];
    // 多态的局限性:父类类型的变量 不能 用来调用子类的方法
    //[aa run];

    // 将aa转为Dog *类型的变量
    Dog *dd = (Dog *)aa; // Dog乃

    [dd run];
时间: 2024-10-06 23:47:52

黑马程序员------OC面向对象之多态的相关文章

黑马程序员-OC面向对象继承关系和组合关系笔记

继承关系是描述类和类之间的关系,两个类分别称为子类和父类,子类继承了父类,子类就拥有了父类的属性和方法: 继承的关系特点描述出来就是:** "是" **  (例如:学生类 是 人类) 组合关系描述的语句是:**** "拥有" ***  (例如:学生有成绩这个属性,而成绩属性本来就是一个成绩类的对象 ) 继承示例代码: #import <Foundation/Foundation.h> //Animal类的声明 @interface Animal : NS

黑马程序员-OC面向对象多态笔记

面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: 1 int main() 2 { 3 //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 4 Animal *a = [Dog d];//父类指针指向了子类对象 5 6 } 多态的定义是比较简单的,也好理解,关键在于它的指针动态绑定,究竟调用哪个方法: 1 #import <Foundation/Foundation.h> 2 3 //Animal类的声明 4 @interface

黑马程序员------OC面向对象之封装

---Android培训.iOS培训.Java培训,期待与您交流----- 一.面向对象和封装 面向对象三大特征:封装.继承.多态. 封装是对象和类概念的主要特性.它是隐藏内部实现,稳定外部接口,可以看作是"包装". 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 好处:使用更加简单  变量更加安全 可以隐藏内部实现细节  开发速度加快. 苹果官方文档中,有一个配图生动的阐释了封装: @interface用于给人们显

黑马程序员------OC面向对象之继承

------Android培训.iOS培训.Java培训,期待与您交流----- 一.继承的基本概念 继承是面向的三大特征之一,指的是在一个类的基础上,定义一个新类:原本的类成为父类(基类),新类称为子类(派生类). 生活中,继承的例子也是数不胜数,比如一个儿子继承了他父亲,那么他就享受他父亲的财产了,当然不是全部,详细解释见下文. 再如,一个电器系列: 一层接着一层,电器为父类,下面的洗衣机.电脑.电视机都是电器的子类,下面的品牌名又是洗衣机.电脑.电视机的子类,当然也是电器的子类. 体现在代

黑马程序员——OC面向对象的三大特性

一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 2. set方法 1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 2) 命名规范: ? 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写 ? 形参名称不要跟成员变量同名 3

【黑马程序员】————面向对象语法2

一.      set方法和get方法 1.          set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 成员变量尽量不要用@public 2.          set方法 1)       作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 2)       命名规范: 1> 方法名必须以set开头 2> set后面

黑马程序员-OC self super isa指针

self指针: self是oc面向对象设计中的一个特殊指针,相当于java中的this,但是比this强大,this只能访问实例对象的相关方法和成员变量,或者说this只代表实例对象: self不仅可以代表实例对象,还可以代表类对象:谁调用当前方法,self就代表谁:如果self用在了以"-"号的方法中,也就是对象方法中,那么就代表实例对象,若果在"+"号开头的方法中,self就代表类对象,因为只有类对象才能调用以"+"号开头的方法: self调

黑马程序员 oc与c的区别,联系

1.文件的扩展名的区别       1>c语言源文件的扩展名是.c,而oc的扩展名是.m       2>c语言经过编译之后得到的目标模块扩展名是.obj,而oc编译之后是.o       3>c语言目标程序与其他目标程序和库函数经过连接得到可执行文件的扩展名是.exe,而oc是.out2.两者的编程思想是不同的        c语言是面向过程的编程语言,oc是面向对象的编程语言3.oc语言对于c语言的拓展       oc是面向对象的编程语言,它的基本数据类型比c语言多了个bool类型

【黑马程序员】————面向对象语法1

一.  面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 常用术语 面向过程 Procedure Oriented 面向对象 Object Oriented,简称OO 面向对象编程 Object Oriented Programming,简称OOP 二.  类和对象的关系 面向对象中有2个非常重要的概念:类和对象 OC中的面相对象 1)      OC中的类相当于图纸,用来描述一类事物.也就是说,要想创建对象,必须先有类 2)      OC