黑马程序员_多态
一、黑马程序员_多态1基本使用
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog (@"Animal -eat...");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog (@"Dog -eat...");
}
@end
int main()
{
NSObject *n = [Dog new]; // 多态
// 多态: 多种形态
Dog *d = [Dog new]; // Dog 类型
// 多态: 父类指针指向子类对象
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象
[a eat];
return 0;
}
二、黑马程序员_多态2使用注意
#import <Foundation/Foundation.h>
// Animal 动物
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog (@"Animal -eat...");
}
@end
// Dog 狗
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog (@"Dog -eat...");
}
@end
// Cat 猫
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog (@"Cat -eat...");
}
@end
int main()
{
NSString *s = [Cat new];
Animal *c = [Cat new];
// Cat *c = [Animal new]; // 错误写法
// Cat *c = [Dog new]; // 错误写法
NSObject *n = [Dog new]; // 多态
// 多态: 多种形态
Dog *d = [Dog new]; // Dog 类型
// 多态: 父类指针指向子类对象
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象
[a eat];
return 0;
}
三、黑马程序员_多态3多态的好处
#import <Foundation/Foundation.h>
// Animal 动物
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog (@"Animal -eat...");
}
@end
// Dog 狗
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog (@"Dog -eat...");
}
@end
// Cat 猫
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog (@"Cat -eat...");
}
@end
// 如果参数中使用的是父类类型,可以传入父类、子类对象
// 这个函数专门用来喂动物
void feed(Animal *a)
{
[a eat];
}
int main()
{
Dog *dd = [Dog new];
feed(dd);
Cat *cc = [Cat new];
feed(cc);
NSString *s = [Cat new];
Animal *c = [Cat new];
// Cat *c = [Animal new]; // 错误写法
// Cat *c = [Dog new]; // 错误写法
NSObject *n = [Dog new]; // 多态
// 多态: 多种形态
Dog *d = [Dog new]; // Dog 类型
// 多态: 父类指针指向子类对象
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象
[a eat];
return 0;
}
四、黑马程序员_多态4局限性
#import <Foundation/Foundation.h>
/*
多态:
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数、方法参数中使用的是父类类型,可以传入父类、子类对象
4.局限性:
* 父类类型的变量不能直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类类型的方法
*/
// Animal 动物
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog (@"Animal -eat...");
}
@end
// Dog 狗
@interface Dog : Animal
- (void)run;
@end
@implementation Dog
- (void)run
{
NSLog (@"Dog -run...");
}
- (void)eat
{
NSLog (@"Dog -eat...");
}
@end
// Cat 猫
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog (@"Cat -eat...");
}
@end
// 如果参数中使用的是父类类型,可以传入父类、子类对象
// 这个函数专门用来喂动物
void feed(Animal *a)
{
[a eat];
}
int main()
{
Animal *aa = [Dog new];
// 多态的局限性:父类类型的变量不能用来调用子类的方法
[aa run];
// 将aa转为Dog * 类型的变量
Dog *dd = (Dog *)aa;
[dd run];
Dog *d = [Dog new];
[d run];
/*
Dog *dd = [Dog new];
feed(dd);
Cat *cc = [Cat new];
feed(cc);
NSString *s = [Cat new];
Animal *c = [Cat new];
// Cat *c = [Animal new]; // 错误写法
// Cat *c = [Dog new]; // 错误写法
NSObject *n = [Dog new]; // 多态
// 多态: 多种形态
Dog *d = [Dog new]; // Dog 类型
// 多态: 父类指针指向子类对象
Animal *a = [Dog new];
// 调用方法时会检测对象的真实形象
[a eat];
*/
return 0;
}