Object-C 学习笔记(九)---面相对象(多态)

多态:父类引用指向于子类对象,产生多态,子类方法覆盖父类方法.

注意:多态只作用于方法,对成员属性没有起作用.

例子:

//
//  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;
}

打印结果:


可以看到:父类引用指向于子类,调用时父类方法被覆盖


阅读更多
文章标签: 多态
个人分类: Object-C
上一篇Object-C 学习笔记(八)---面相对象(继承)
下一篇Object-C 学习笔记(十)---内存管理MRC
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭