1、继承的特性
①传递性:不在同一继承树分支上的两个类就不会存在继承关系,比如狗和猫
②is-a:也就是子类和父类需要满足is-a的关系,is-a可以理解为“是一个”,比如 猫是一个动物,反过来动物是猫明显答案是否定的,但是继承也要满足单一继承,比如 猫是猫科动物、动物,它不能同时继承猫科动物、动物
③子类可以继承父类的属性和方法,子类还可以拓展出自己的特殊属性和方法
2、为何要使用继承呢?
子类中所有重复的代码都被抽取到父类中,子类可以继承父类的属性和方法,成功的避免了代码的冗余。由此得到,继承可以防止子类中出现重复的程序代码。
3、继承的相关术语
超类(superclass)所要继承的类
父类(parenclass)超类的另一个称呼
子类(subclass)继承后的类
孩子类(childclass)子类的另一个称呼
4、定义子类
语法 : @interface 类名:父类名
“:”含义是拓展,意味着子类出了继承父类的属性和方法外还可以拓展出自己特殊的属性和方法
5、子类的调用
调用子类的方法时,首先向子类询问是否能够调用该方法,如果子类有该方法则直接调用该方法,如果子类没有该方法则去找父类,如果有则调用之,没有就继续向上查找,直到NSObject,如果没有找到则报错。
6、继承方法的重写
子类和父类具有相同的方法名、参数列表、返回类型,但是子类的方法实现和父类的方法实现有有所不同,这就是方法的重写
方法重写的特点:(1)发生在父类与子类之间(2)方法名相同,参数列表相同,返回类型相同
如:[super init];
所学的例子如下 富人类和富二代类
富人类:
#import <Foundation/Foundation.h>
@interface RichMan : NSObject
@property (nonatomic,retain) NSString *name;//姓名
@property (nonatomic,assign) int age;//年龄
@property (nonatomic,assign) BOOL gender;//性别
- (void) sayHello;//打招呼
- (void) charge;//刷卡
@end
#import "RichMan.h"
@implementation RichMan
@synthesize name,age,gender;
//打招呼
- (void) sayHello{
NSLog(@"大家好,我叫:%@",name);
}
//刷卡
- (void) charge{
NSLog(@"嘻唰唰!嘻唰唰!");
}
@end
富二代类
#import "RichMan.h"
@interface Rich2nd : RichMan
- (void) race;//飙车
@end
#import "Rich2nd.h"
@implementation Rich2nd
//刷卡
- (void) charge{
NSLog(@"掏出老爸的卡刷一下");
[super charge];//使用super关键字发送消息(调用父类的方法)
}
//飙车
- (void) race{
NSLog(@"开着拖拉机,奔跑在厦禾路上");
}
@end
main函数
#import <Foundation/Foundation.h>
#import "Rich2nd.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Rich2nd *richSecond = [[Rich2nd new] autorelease];
[richSecond charge];
}
return 0;
}
2013-10-13 14:52:24.144 继承[2012:303] 掏出老爸的卡刷一下
2013-10-13 14:52:24.146 继承[2012:303] 嘻唰唰!嘻唰唰!