继承

本文详细介绍了Objective-C中的继承概念,包括继承的语法、好处及限制,并通过实例演示了如何利用继承来提高代码复用性和管理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      1:当一段代码中包含了大量重复的内容,代码看起来很没有效率,编程时出现大量的重复代码意味着代码架构是一个失败的架构,因为你要维护两倍的代码,修改代码时,必须修改两处,这样很容易出错,如果你忘记更改其中一处代码,一些奇怪的bug就会出现,为了解决这个问题,提出了继承的概念;

   继承的语法格式:@interface Circle:NSObject     

/*
 继承的好处:抽取了公共代码,提高了代码的复用率
 坏处:代码的耦合性强(耦合性:两个类彼此离不开对方)
 继承要点:
     1:当调用方法时,首先检测子类有没有实现这个方法,如果子类没有实现就会调用父类实现
     2:重写:子类实现父类中声明的方法
     3:子类里面声明的成员变量和父类里面声明的成员变量不能同名
     4:OC不支持多继承,只支持单继承(可以通过类别(category)的方法实现)
*/
#import <Foundation/Foundation.h>
@interface Animal:NSObject
{
    int _weight;
}
-(void)setWeight:(int)weight;
-(int)weight;
-(void)eat;
@end
@implementation Animal
-(void)setWeight:(int)weight
{
    _weight=weight;
}
-(int)weight
{
    return _weight;
}
-(void)eat
{
    NSLog(@"体重为%i的动物在吃!",_weight);
}
@end
@interface Bird : Animal
@end
//Bird继承了Animal就能拥有Animal的所有方法和成员变量
//Animal是Bird的父类(也叫超类:superclass)
//Bird,Dog是Animal的子类(子类:subclasses)
@implementation Bird
//方法重写:子类实现父类中声明的方法
-(void)eat
{
    NSLog(@"体重为%i的小鸟在吃!",_weight);
}
@end
@interface Dog : Animal
@end
@implementation Dog
@end
int main(int argc,char *argv[])
{
    Bird *d= [Bird new];
    [d setWeight:10];
    /*
     方法调度:Objective_C的方法调度机制将在当前的类中搜索相应的方法,如果无法在
     接收消息的对象的类文件中找到相应的方法,它就会在该对象的超类中进行查找;
     这种操作就像说“我在这里没有找到它,因此我将在它的超类中继续找”
     必要时它将会在继承链的每一类中重复的执行此操作,假如某个方法在Dog 和 Animal
     中都没有找到,调度程序会继续在NSObject中查找,如果在顶层的NSObject中也没
     有找到该方法,则会出现一个运行时错误,同时还会出现一个编译时警告信息
     */
    [d eat];
    Dog *dog =[Dog new];
    [dog setWeight:20];
    [dog eat];
    
}
运行结果:


如果在NSObject依旧找不到方法时,会出现以下错误:


2:成员变量的作用域

     @private:当前类的实现中访问

     @protected : 当前类和子类的实现中访问

     @public :任何地方都可以访问

     @package:同一个体系内可以访问,在某个框架中直接访问,介于@private和@public之间

     注意:如果在@interface中声明的成员变量没有明确说明作用域:默认为@protected

     如果在@implementation 中声明的成员变量没有明确说明作用域,默认为@private

3:super 的使用

     使用场合:如果子类需要在父类方法的基础上进行重写,应该用super调用父类的方法     

#import<Foundation/Foundation.h>
@interface Zoombie:NSObject
-(void)walk;
+(void)walk;
@end
@implementation Zoombie
+(void)walk
{
    NSLog(@"僵尸向前挪了几步");
}

-(void)walk
{
    NSLog(@"向前挪几步");
}
@end
@interface DancerZombie : Zoombie
@end
@implementation DancerZombie
-(void)walk
{
    //NSLog(@"向前挪几步");
    //super:调用父类中的实现方法
    [super walk]; //调用的是对象方法还是类方法,取决于super所处的环境(如果super本身在对象方法中,调用的就是对象方法,如果super本身在类方法中,调用的就是类方法)
    NSLog(@"跳几下");
}
@end
int main()
{
    DancerZombie *d=[DancerZombie new];
    [d walk];
    return 0;
}
运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值