OC编程-多态、继承


一、继承:

先定义一个类:

@interface Animal : NSObject

{

NSString *name;

GCFloat height;

}

-(void)eat;

@end


定义一个子类:

@interface Dog :Animal

{

NSString *speed;

}

-(void)run;

@end

在上面定义的两个类中:Animal 称为父类  Dog子类,后者继承了前者。


分别定义一个实例变量:

Animal *animal

 Dog *dog;

在Animal类对象animal中有实例变量name 和 height 和方法eat;

在Dog  子类的对象中有实例变量name、height和speed以及方法eat、run;

可以看到在子类继承父类的过程中,子类继承了父类的实例变量和方法。

这就是继承,一个类拥有另一个类的属性和方法的过程。


二、多态


一直有个疑问就是怎么理解书上说的---“在调用类方法或者实例方法的时候所有可以用父类的地方都可以用其子类替换”


带着这个疑问我们来剖析什么是多态。

a、概念说明 
->一种类型,多种形态 
->在OC中表现为父类指针可以指向父类对象,也可以指向子类对象 
->直到运行期,根据父类指针实际指向的对象的类型,确定执行父类方法还是子类中重写的方法

b、多态产生的条件 
->必须有继承关系; 
->子类要重写父类的方法; 
->父类指针指向子类对象

c、好处与限制 
->好处:使用多态后,可以用父类指针操纵所有的子类对象,程序的可扩展性就会增强 
->限制:父类指针不能调用子类新增的方法(只能重写的) 

背景:有一个人有两只狗,它们品种不同,跑的速度不同。

声明一个对象为人的类

@interface Person :NSObject

{


}


-(void)testWhichDog:(Dog*)dog;

@end


@implement Person

 (void)testWhichDog:( Dog*)dog
 { 
 [dog run];
 }
@end

声明关于狗对象的类

@interface Dog : NSObject

{

NSString *name;

GCFloat height;

}

-(void)run;

@end


@implement Dog

   - (void)run
    {
       NSLog(@"跑的一样快");
    }
@end


子类1

@interface Dog 1:Dog

{

NSString *speed1;

}

-(void)run;

@end


@implement Dog1

   - (void)run
    {
       NSLog(@"dog1跑的快");
    }

子类2

@interface Dog2 :Dog

{

NSString *speed2;

}

-(void)run;

@end

@implement Dog2

  - (void)run
    {
       NSLog(@"dog2跑的快");
    }


 为什么在 (void)testWhichDog:(Dog*)dog中参数要(Dog*)类型

如果不写成Dog*)类型而是Dog1*    Dog2 *这种类型,当狗的数量很多则需要写很多个函数,但是我们可以声明成父类类型,就只需要写一个方法就可以了。父类指针可以访问子类中重写的方法。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moxi_wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值