多态:父类引用指向于子类对象,产生多态,子类方法覆盖父类方法.
注意:多态只作用于方法,对成员属性没有起作用.
例子:
//
// Animal.h
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Animal : NSObject
@property(retain,nonatomic)NSString* name;//名字
@property(assign,nonatomic)NSInteger age;//年龄
@property(retain,nonatomic)NSString* color;//毛色
-(void)play;
-(void)sleep;
-(Animal *)initWithName:(NSString*)name andAge:(NSInteger) age andColor:(NSString*) color;
@end
//
// Animal.m
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Animal.h"
@implementation Animal
@synthesize name = _name,age = _age,color = _color;
-(void)play
{
NSLog(@"我正在玩耍");
}
-(void)sleep
{
NSLog(@"我正在睡觉");
}
-(Animal *)initWithName:(NSString*)name andAge:(NSInteger) age andColor:(NSString*) color
{
if (self = [super init]) {
self.name = name;
self.age = age;
self.color = color;
}
return self;
}
@end
//
// Dog.h
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Animal.h"
@interface Dog : Animal
-(void)watchDoor;
-(void)play;//复写父类的方法
@end
//
// Dog.m
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Dog.h"
@implementation Dog
-(void)watchDoor
{
NSLog(@"正在看门口");
}
-(void)play//复写父类的方法
{
NSLog(@"狗正在玩啥");
}
@end
//
// Cat.h
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Animal.h"
@interface Cat : Animal
-(void)catchMouse;
-(void)play;//复写父类的方法
@end
//
// Cat.m
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Cat.h"
@implementation Cat
-(void)catchMouse
{
NSLog(@"猫正在抓老鼠");
}
-(void)play//复写父类的方法
{
NSLog(@"猫正在玩啥");
}
@end
//
// main.m
// Extend
//
// Created by 5016 on 13-12-3.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Cat.h"
#import "Dog.h"
void method(Animal *animal)
{
[animal play];
}
int main(int argc, const char * argv[])
{
Animal *animal1 = [[Dog alloc] initWithName:@"考拉" andAge:4 andColor:@"白色"];//父类引用指向子类对象,发生多态,方法覆盖
method(animal1);
Animal *animal2 = [[Cat alloc] initWithName:@"猫咪" andAge:2 andColor:@"黄色"];
method(animal2);
return 0;
}
打印结果:
可以看到:父类引用指向于子类,调用时父类方法被覆盖