关闭

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

标签: 多态
404人阅读 评论(0) 收藏 举报
分类:

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

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

例子:

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

打印结果:


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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场