黑马程序员----OC学习之继承

继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.一个类继承另外一个类,就具有该类的属性和方法。例如A类继承B类,A类就具有B类的属性和方法,A类称作为B类的子类,B类称作为A类的父类和超类。

如何判断继承是否合理:
通过 is a 谁是谁。例如 IPHONE 是手机。则说明他们有继承关系(类对象中有 isa(指针),就是通过继承来的)。
继承实现方式:在声明的时候,用:在后面写上父类的名字

@interface ClassName:FatherClassName
例如:
@interface Cat : NSObject

继承的好处和缺点:
1).提高了代码的复用性
2).继承的出现让类和类之间产生类关系,提供了多态的前提。
3).耦合性太强,依赖关系太强。

注意点:
1).在子类中,不能重复定义父类的成员变量。
2).调用某个方法时,优先在子类中查找,如果找不到,再到父类中查找。
3).OC中只有单继承(只有一个父类),没有继承,但支持多重继承 
单继承的原因:如果有多个父类,父类都具有相同名字,子类则无法区分是那个父类的方法

例子:通过animal cat dog 类举例。
首先判断继承关系。
cat is a animal  猫是动物,所有具有继承关系
dog is a animal 狗是动物,所有具有继承关系
动物都具有 年龄、名字、属性、吃的行为。

一 .父类 Animal

===1.animal 声明类 .h文件===
 
@interface Animal : NSObject
{
    @private
    int _age;
    NSString *_name;
}
 
/*对属性封装*/
-(void)setAge:(int) age;
-(int)age;
 
-(void)setName:(NSString *)name;
-(NSString *)name;
 
-(void)eat;
@end
===2.animal 实现类 .m文件===
@implementation Animal
 
-(void)setAge:(int) age
{
    //当age<0时,则是不合理数据,则该赋值为0。
    _age=age<0?0:age;
}
 
-(int)age
{
    return _age;
}
 
-(void)setName:(NSString *)name
{
    _name=name;
}
 
-(NSString *)name
{
    return _name;
}
 
-(void)eat
{
    NSLog(@"animal eat ..");
}
 
@end

二.子类 dog类

===1.声明类===
#import "Animal.h" 
//导入Animal.h ,让Dog继承Animal类,具有父类的属性和方法
@interface Dog : Animal
@end
 
===2.实现类===
@implementation Dog
 
@end

三.子类 cat 类

===1.声明类===
#import "Animal.h" 
//导入Animal.h ,让Dog继承Animal类,具有父类的属性和方法
@interface Cat : Animal
@end
 
===2.实现类===
@implementation Cat
//重写 Animal 中的 eat 方法
 
/*
 方法重写:当子类用了父类的同样的方法(包括类方法 对象方法),称之为重写,
 调用遵守就近原则(先找子类,再找父类)
  
 继承调用原理:
 在子类 类对象中,保存super指针,指向父类,在调用方法时,先在子类中去找相应的方法,
 如果找到则执行,如果没有,则通过父类super指针调用父类的相应方法
  
 调用过程:
 1).调用方法(栈)在对象(堆)中通过lsa指针 去搜索 类对象(堆)中是否有调用的方法
 2).如果有则直接执行
 3).如果没有,则通过类对象中的super指针到父类中的搜索。
 */
-(void)eat
{
    NSLog(@"Cat eat ..");
}
@end

四.主函数

#import "Cat.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{   
    @autoreleasepool {
        NSLog(@"======Cat 信息======");
        //初始化实例 cat1
        Cat *cat = [Cat new];
        //animal中已经实现了setAge方法,当cat 继承animal类时,会自己继承该方法。
        [cat setAge:10];
        NSLog(@"age=%d",[cat age]);
        //调用 cat 中重写的 eat 方法
        [cat eat];
   
        NSLog(@"======Dog 信息======");
        Dog *dog = [Dog new];
        [dog eat];//如果没有重写,则会掉用父类的eat方法        
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值