Object-C技术学习,更多资源请访问 https://www.itkc8.com
// main.m
// 多态
//
// Created by Goddog on 15/1/8.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
/*
1.OC指针类型的变量有两个:一个编译时的类型,一个是运行时的类型。编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。两者不一致就出现多态
2.运行时调用该指针变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类的行为特征。
3.指针在编译阶段只能调用其编译时类型所具有的方法,但在运行时则执行它运行时类型所具有的方法。
4.解决编译类型检查问题,OC提供了一个id类型,程序可以对任何对象或任何类型的指针变量赋值为id类型的变量,而且使用id变量
可以调用该变量实际所指向的方法。
*/
//
// Man.h
// 多态
//
// Created by Goddog on 15/1/8.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Man : NSObject
-(void) say;
-(void) see;
@end
//
// Man.m
// 多态
//
// Created by Goddog on 15/1/8.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import "Man.h"
@implementation Man
-(void) say
{
NSLog(@"说");
}
-(void) see
{
NSLog(@"看");
}
@end
//
// SuperMan.h
// 多态
//
// Created by Goddog on 15/1/8.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Man.h"
@interface SuperMan : Man
-(void) fly;
@end
//
// SuperMan.m
// 多态
//
// Created by Goddog on 15/1/8.
// Copyright (c) 2015年 Goddog. All rights reserved.
//
#import "SuperMan.h"
@implementation SuperMan
-(void) say
{
NSLog(@"超人覆盖了说");
}
-(void) fly
{
NSLog(@"超人会飞");
}
@end
#import <Foundation/Foundation.h>
#import "SuperMan.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//编译时类型和运行时类型完全一样,非多态
Man* man = [[Man alloc] init];
[man say];
[man see];
//编译时类型和运行时类型完全一样,非多态
SuperMan* superMan = [[SuperMan alloc] init];
[superMan say];
[superMan see];
[superMan fly];
//编译时类型和运行时类型不一样,多态
Man* superManAndMan = [[SuperMan alloc] init];
[superManAndMan say];
[superManAndMan see];
//[superManAndMan fly];//父类中无fly方法,故不能编译
//可将任何类型的指针变量赋值给id类型的变量
id mansuper = superManAndMan;
[mansuper fly];
}
return 0;
}
Object-C技术学习,更多资源请访问 https://www.itkc8.com