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;
}
运行结果: