黑马程序员技术交流社区

标题: 这里有个强制转换这块有点糊里糊涂的,感觉没必要啊,参数填写id呢? [打印本页]

作者: 菜鸟八哥    时间: 2015-1-15 17:12
标题: 这里有个强制转换这块有点糊里糊涂的,感觉没必要啊,参数填写id呢?
//没有继承就没有多态
//代码的体现:父类类型的指针指向子类的对象
//好处:如果函数\方法参数中使用的是父类类型,可以传入父类,子类对象
//局限性:父类类型的变量 不能 直接调用子类特有的方法。必须强制转为子类类型后,才能直接调用子类特有的方法
#import<Foundation/Foundation.h>
@interface Animal :NSObject
-(void)eat;
@end

@implementation Animal
-(void)eat
{
NSLog(@"动物-吃东西");

}
@end



@intface Dog : Animal


@end

@implementation Dog
//重写:一般直接在类的实现中直接定义,不需要再声明,因为父类已经有声明
-(void)eat
{

NSLog(@"Dog-吃东西");
}


@end
//注意:参数填写父类的指针,让父类的指针接收接收子类的对象Animal *a = dd或者CC (在多态中以后会常见)
//如果参数中使用的是父类类型,可以传入父类,子类对象。
void feed(Anamal *a)
{

  [a eat];

}



int main()
{

Dog *dd = [Dog new];
Cat *cc = [Cat new];
feed(dd);
feed(cc);
   

Animal *a = [Animal new];



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

//调用方法时会检测对象的真实形象-由于上面的真实对象是Dog,所以父类指针指向的对象调用eat,会在Dog对象方法里面找,而不是去调用父类的eat方法。

//多态中的局限性:父类类型的变量 不能 用来调用子类的方法,
//  [a eat]; //会出现警告,但是可以运行,解决方式(强制类型转换)  将a转为Dog * 类型的变量

Dog *q = (Dog *)a;将强制转换类型后的变量赋值给变量q;

然后:[q eat]  //这个时候就不会出现警告了










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2