黑马程序员_OC面向对象之继承和多态

一、继承

1.使用继承可以使得子类拥有父类的所有成员变量和方法

2.继承的子类不可以重新定义和父类名称相同的成员变量

3.子类重新实现父类中的方法,称之为重写

4.当调用某个方法时,优先在子类中寻找,如果子类没有定义该方法,就去父类中寻找

5.继承缺点是:耦合性强

继承可以抽取重复的代码,建立类之间的相互关系,使得代码更简洁,设计更合理。例子代码如下:

#import <Foundation/Foundation.h>

//声明对象的属性和行为
@interface Car : NSObject
{
    
    int _wheels;
    int _speed;
    
}
//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;

//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;


- (void)drive;

+ (void)test;
@end

//实现类
@implementation Car

//set方法
- (void)setWheels:(int)wheels
{
    if(wheels <= 0)
    {
        self->_wheels  = 1;
    }
    
    self->_wheels = wheels;
}
//get方法
- (int)wheels
{
    return self->_wheels;
}

//speed的set方法
- (void)setSpeed:(int)speed
{
    if (speed <= 0) {
        speed = 1;
    }
    
    _speed = speed;
}
//speed的get方法
-(int)speed
{
    return _speed;
}

- (void)drive
{
    NSLog(@"汽车在行驶---");
}

+ (void)test
{
    NSLog(@"测试super的使用");
}
@end


//定义Jeep类
@interface Jeep : Car

- (void)drive;
+ (void)test;

@end
//实现Jeep类
@implementation Jeep

- (void)drive
{
    NSLog(@"Jeep在行驶---");
}

+ (void)test
{
    NSLog(@"Jeep在行驶+");
    [super test];
}
@end

//定义Benz类
@interface Benz : Car

- (void)drive;
+ (void)test;
@end

@implementation Benz

- (void)drive
{
    NSLog(@"Benz在行驶---");
}

+ (void)test
{
    NSLog(@"Benz在行驶+");
    [super test];
}
@end

int  main()
{
    
    Jeep *j =  [Jeep new];
    [j setWheels:10];    //子类可以拥有父类的方法
    [j setSpeed:1000];
    NSLog(@"车子有%d个轮子,速度为%d",[j wheels],[j speed]);
    [j drive];
    
    Benz *b = [Benz new];
    [b setWheels:23];
    [b setSpeed:139];
    NSLog(@"车子有%d个轮子,速度为%d",[b wheels],[b speed]);
    [b drive];
    
    //super的使用 和类方法的使用 例子
    [Jeep test];
    [Benz test];
    return 0;
}

运行结果为:



二、多态

多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象

如果函数或参数中使用的是父类类型,可以传入父类、子类对象,但是父类类型的变量不能直接调用子类特有的方法

具体的实现代码可以在上面继承的代码上加入:

//多态的例子声明的方法
void run(Car *c)
{
    [c drive];
}

int  main()
{
    
    Jeep *j =  [Jeep new];
    [j setWheels:10];    //子类可以拥有父类的方法
    [j setSpeed:1000];
    NSLog(@"车子有%d个轮子,速度为%d",[j wheels],[j speed]);
    [j drive];
    
    Benz *b = [Benz new];
    [b setWheels:23];
    [b setSpeed:139];
    NSLog(@"车子有%d个轮子,速度为%d",[b wheels],[b speed]);
    [b drive];
    
    //super的使用 和类方法的使用 例子
    [Jeep test];
    [Benz test];
    
    //多态的使用
    Car *c = [Jeep new];
    [c drive];
    
    run(b);
    return 0;
}

运行结果:






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值