继承是面向对象程序的三大特征之一,意思是基于一个类的基础,定义一个新类。
被继承的类成为父类,新类成为子类。
继承的实际例子有许多。例如,一个儿子继承了他父亲,那么他就继承了他父亲的财产。
例如基类是Person,那么我们可以继承Person这个类,产生新的子类Student,Teacher
在这里Person是Student类和Teacher类的父类。
*能够抽取重复代码
*建立了类和类之间的联系
*不改变原来模型的基础上,能够扩展出新的方法
@interface Person:NSObject //Person继承了NSObject,获得NSObject类的方法; @end @interface Student :Person //Student类继承Person类 @end @interface Teacher:Person //Teacher类继承Person类 @end
*父类的声明需要在子类的前面 ,不然子类无法识别未声明的语句
*子类不能拥有和父类相同的成员变量,但是子类可以重写父类原有的成员方法,例如重写dealloc方法
*调用某个成员方法时,优先去当前类中找,如果找不到,去父类中找
Super作为关键字的作用:
*直接调用父类中的某一个方法,例如[super dealloc];
*Super处在对象方法中,那么就会调用父类的对象方法;super处于类方法中,那么就会调用父类的类方法。
#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; - (int)age; - (void)test; @end @implementation Person - (void)setAge:(int)age { self->_age = age; } - (int)age { return self->_age; } - (void)test { // self:指向了方向调用者,代表着当期对象 int _age = 20; NSLog(@"Person的年龄是%d岁", self->_age); } @end int main() { Person *p = [Person new]; [p setAge:10]; [p test]; return 0; }
objective-C中为什么出现分类这种机制,那么分类的好处都有啥?
例如你已经完成了一个Person类的代码。代码如下:
#import <Foundation/Foundation> @interface Person :NSObject - (void) run;//跑 - (void) eat;//吃 @end
但是一段时间后,我们发现Person这个类不仅需要run,eat功能,还要能做到jump和swim。那么我们一般的做法就是直接在Person类中添加jump,swim方法。当然在这里是没有任何问题的。但是在实际开发项目中,由于代码量十分巨大,以及逻辑相当复杂的情况下,我们直接修改之前源代码是冒有很大的风险的!
神说我们要有分类,于是我们便有了分类。当你仅仅是想在原有父类的基础上给父类扩充一些方法的时候,分类是一种更好的选择。
#import <Foundation/Foundation> #import”Person.h”//既然是对原有类的接口的扩展,所以必须包括原始接口 @interface Person(jumpAndSwim)//告诉编译器这是为Person定义的分类为jumpAndSwim - (void) jump;//跳 - (void) swim;//游 @end
这样我们就做到了在不修改原先代码的情况下,完成了方法的扩展!
但是使用分类要注意以下事项:
*分类可以访问原类中的成员变量,但是在分类不能添加任何成员变量。若需要添加成员变量可以考虑创建子类
*分类中的方法名可以与原类的某个方法名相同(即重载),但是原类的同名方法将失效,不能访问。
*可以创建很多的分类
黑马程序员_IOS开发_Objective-C学习笔记_继承和分类
原文:http://www.cnblogs.com/NSMAMU/p/4455830.html