多态

继承

1.在Oc中每个类对象最开始的位置都会有一个isa指针,该指针指向一块内存区域,分发表中先找本类,再找父类方法.

 2. self在实例方法中表示指向当前对象指针,在类方法中需要[self class]。用“_下划线”访问没调用get set方法,加self.后实际上调用了其成员的get set方法。


1.多态:建立在继承之上,同一类型对象对同一方法呈现不同的实现(方法)状态。(即“一个接口多个方法”的意思,属于经常用到的情况)

2.多态的实现方法:

  • 虚函数(接口):运行时多态。用处当父类定义的方法不易实现的时候。虚函数即只声明不实现的抽象基类。现实场景:领导下达命令让手下做。发生在上层。
  • 重写:运行时多态。用处当子类继承父类的方法时,父类不能满足子类的需求。发生在子类与父类之间(中下层),金字塔模型。
  • 重载:操作性(编译时运行)多态。不建立在继承基础之上,目前oc不支持重载。

3.通过定义一个通用的调用方法,以简化调用(好处符合单一责任原则):

如:在虚函数中定义-(void)show;-(void)showContext;

  实现-(void)show{},-(void)showContext{[self show]};

4.id动态数据类型

  • id是指向任何一个继承NSObject对象的指针,设置nil。
  • 当需要定义一个不知道什么类型的时候使用,在编码阶段不报任何警告。
  • 可以对其发送任何存在的(消息)方法

Animal.h

@interface Animal : NSObject
{
    NSString *_name;
}
@property(nonatomic,retain)NSString *name;

-(Animal *)initWithName:(NSString *)aName;

/*
声明虚函数(方法)
*/
-(void)learn;

/*
统计学习的内容
*/
-(void)statisInfo;
@end

Animal.m

#import "Animal.h"

@implementation Animal
@synthesize name = _name;

-(Animal *)initWithName:(NSString *)aName
{
    self = [super init];
    if (self)
    {
        self.name = aName;
    }
    return self;
}
/*
虚函数:什么都不用实现
 */
-(void)learn
{
    
}

//统计学习内容
-(void)statisInfo
{
   //NSLog(@"第%d个",++i);
    [self learn];
}
@end

Preson.h

#import "Animal.h"

@interface Person : Animal

@end

Preson.m

#import "Person.h"
@implementation Person

-(void)learn
{
   
    NSLog(@"学习吃东西");
}
@end

Student.h

#import "Person.h"

@interface Student : Person

@end

Student.m

#import "Student.h"


@implementation Student
-(void)learn
{
    [super learn];
    NSLog(@"学习ios开发技能");
}

@end

AppDelegate.m

#import "AppDelegate.h"
#import "Animal.h"
#import "Person.h"
#import "Student.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    Animal *s = [[Student alloc]initWithName:@"jobs"];
    [s statisInfo];

    [self.window makeKeyAndVisible];
    return YES;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值