------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
多态
/*
类和类之间的关系
多种形态,没有继承就没有多态
对象和对象的关系
1> 组合 2> 依赖 3> 关联
多态: 不同对象以自己的方式,响应同名的方法
多态的条件:
1> 存在继承关系
2> 存在方法重写(一定会存在同名方法(父类和子类之间一定有同名方法))
3> 父类指针指向子类对象
好处: 如果函数\方法参数中使用的是父类类型,可以传入父类和子类对象
局限性:
1> 父类类型的变量不能直接调用子类特有的方法,必须强转为子类类型变量后,才能调用子类特有的方法
*/
#import <Foundation/Foundation.h>
//Animal类的声明
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal 吃东西");
}
@end
@interface Dog : Animal
@end
@implementation Dog
//重写
- (void)eat
{
NSLog(@"Dog 吃东西");
}
@end
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"Cat 吃东西");
}
@end
//如果参数中使用的是父类类型,可以传入父类和子类对象
void feed(Animal *a){
[a eat];
}
int main(int argc, const char * argv[]) {
//父类指针指向子类对象
// NSObject *n = [Dog new];
// NSObject *n = [Animal new];
//多种形态 Dog类型
Dog *d = [Dog new];
Cat *c = [Cat new];
Animal *a = [Animal new];
//多态:父类指针指向子类对象
Animal *a1 = [Dog new];
//调用方法时会动态检测对象的真实形象
[a1 eat];
feed(a);
feed(d);
feed(c);
//多态的局限性: 父类类型的变量不能用来调用子类的方法
Animal *aa = [Dog new];
//强制转换 将aa转为Dog *类型的变量
// Dog *dd = (Dog *)aa;
// [dd eat];
// [aa run];
[(Dog *)aa eat];
return 0;
}