2.继承
main.m
#import <Foundation/Foundation.h>
#import "Father.h"
#import "NotSon.h"
#import "Son.h"
#import "SonA.h"
#import "SonB.h"
int main(int argc,const char * argv[]) {
@autoreleasepool{
#pragma mark -----------继承-------------------
/*
继承:继承是避免冗余,提高代码的可重用和可维护性的有效手段
(书P54)
继承的传递性:直接父类、间接父类
继承需要符合的关系: is-a
子类和父类都需要满足 is-a的关系,才存在继承关系。
继承概念下的 is-a关系是个单向的关系
子类具有父类的属性和行为,以及自身特殊的属性和行为
要记住 X is-a Y隐喻着X可以做出任何Y可以做出的事情,而且还有可能会做出更多的事情
*/
/*
继承的特点
1.使用继承可以实现代码的重用,减少代码冗余
2.OC中一个类可以继承另一个类,被继承的类称为父类 或者超类(基类),继承的类称为子类 或者派生类(孩子类)
3.子类可以直接"拥有"父类所有允许子类继承的属性和方法
4.子类可以改变父类中已有的方法,执行不同的代码实现
5.OC中只允许单一继承,因为多重继承会有称为"致命方块"的问题(P57)
*/
Father *father = [[Fatheralloc]init];
//点语法的本质是setter和 getter
father.name = @"Jack";
[father sayHello];
[father charge];
//如果这样写代码就会十分的冗余了,并且这样写没有遵循面向对象的一个重要原则:write once,only once
NotSon *notSon = [[NotSonalloc]init];
notSon.name = @"notSon";
[notSon sayHello];
[notSon charge];
Son *son = [[Sonalloc]init];
[son charge];
son.name = @"Rick";
son.homeAddress = @"GZ";
[son sayHello];
[son race];
#pragma mark -------------NSObject中常用的方法及其功能----------
/*
NSObject中常用的方法及其功能
1.方法: +(id)alloc
功能:返回一个分配好内存的对象
说明:已经分配号内存的对象的实例变量会被初始化成默认值
2.方法: +(init)
功能:对已经分配内存大的实例变量初始化(相当于便利初始化函数)
不一定要默认的便利初始化函数,也可以自己写
说明:常见形式
-(id)init
{
if(self = [super init])
{
//初始化
}
return self ;
}
3.方法:+(id)new
功能:同时调用了 alloc和 init
4.方法: -(Class)class
+(Class)class
功能:返回当前对象所属类
5.方法:-(Class)superclass
+(Class)superclass
功能:返回当前对象的父类
6.方法: -(BOOL)isKindOfClass:(Class)aClass
功能:判定receiver是否为Class的实例
说明:判断某个实例是否属于某个类或者子类
7.方法:-(BOOL)isMemberOfClass:(Class)aClass
功能:判断receiver是否为Class的实例
说明:只能判断某个实例是否属于某个类,不能判断是否属于某个父类
8.+(BOOL)isSubclassOfClass:(Class)aClass
功能:判断是否为aClass的子类
说明:判断是否某个类的子类
9.-(BOOL)respondsToSelector:(SEL)aSelector
功能:判断receiver是否响应某个消息,不包括类方法
10.+(BOOL)InstancesRespondToSelector:(SEL)aSelector
功能:判断类的对象是否响应某消息
11.-(BOOL)conformsToProtocol:(Protocol *)aProtocol
功能:判断是否实现某协议
12.-(id)retain
功能:对象引用计数+1
13.-(oneway void)release
功能:对象引用计数 -1
14.-(id)autorelease
功能:对象引用计数-1,且向autoreleasepool发送消息
15.-(NSUInteger)retainCount
功能:返回当前引用计数
16.-(void)perfromSelector:(SEL)aSelector
withObject:(id)anArgument
afterDelay:(NSTiemInvterval)delay;
功能:隔指定时间之后进行方法调用
*/
}
return 0;
}
Father.h
#import <Foundation/Foundation.h>
@interface Father : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSInteger age ;
@property (nonatomic,strong)NSString *hobby ;
-(void)sayHello ;
-(void)charge ;
@end
=====================================================
Father.m
#import "Father.h"
@implementation Father
-(void)sayHello
{
NSLog(@"Hello everybody,my name is %@",self.name);
}
-(void)charge
{
NSLog(@"随便刷,刷刷刷!!!");
}
@end
==========================================================
NotSon.h
#import <Foundation/Foundation.h>
@interface NotSon : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,assign)NSInteger age ;
@property (nonatomic,strong)NSString *hobby ;
-(void)sayHello ;
-(void)charge ;
@end
======================================================================NotSon.m
#import "NotSon.h"
@implementation NotSon
-(void)sayHello
{
NSLog(@"Hello everybody,my name is %@",self.name);
}
-(void)charge
{
NSLog(@"随便刷,刷刷刷!!!");
}
@end
===================================================================
SonA.h
#import "Father.h"
@interface SonA : Father
@end
===================================================================
SonA.m
#import "SonA.h"
@implementation SonA
-(void)sayHello
{
[super sayHello];
NSLog(@"I am SonA");
}
@end
========================================================
SonB.h
#import "Father.h"
@interface SonB : Father
@end
=========================================================
SonB.m
#import "SonB.h"
@implementation SonB
-(void)sayHello
{
[super sayHello];
NSLog(@"I am SonB");
}
@end
=========================================================Son.h
#import "Father.h"
//@interface 类名:父类名 ,在OC中,使用冒号表示一个类继承了另一个类。冒号的含义是扩展,意味着子类除了继承了父类的属性和方法外,还可以扩展出自己的特殊属性和方法(一般情况下,我们继承于NSObject类,可以获取NSObject类中的大量有用的特性)
@interface Son : Father
@property (nonatomic,strong)NSString *homeAddress ;
//自己的方法
-(void)race ;
@end
=========================================================Son.m
#import "Son.h"
@implementation Son
//重写父类的charge方法
-(void)charge
{
/*
重写继承中的方法
特点:
1.发生在父类和子类之间
2.方法名相同,参数列表相同,返回类型相同
*/
NSLog(@"拿老爸的卡出来刷一下);
}
@end