Objective-C面向对象(三)
1.类的继承
OC的继承是单继承,每个子类只有一个直接父类
1.1 继承的特点
OC继承的语法
@interface SubClass :SuperClass
{
//成员变量定义
}
//方法定义部分
子类扩展父类,子类可以继承得到父类的:
- 全部成员变量
- 全部方法(包括初始化方法)
1.2 重写父类的方法
方法的重写必须注意方法签名关键字要完全相同,方法名和方法签名中的形参标签都要完全相同。
1.3 super
super 是OC的关键字,super用于限定该对象调用它从父类继承得到的属性或方法。
2.多态
OC指针类型的变量由两个:一个是编译是的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism);
2.1 多态性
2.2 指针变量的强制类型转换
转换语法:(type*)variable
2.3 判断指针变量的实际类型
判断指针变量实际指向的对象是否为某个类、某个子类的实例,通过如下两个方法完成。
- -(BOOL) isKindOfClass:clazz:判断该对象是否为clazz或其子类的实例
- -(BOOL) is SubclassOfClass:clazz :判断该对象是否为clazz的子类的实例
NSObject* hello = @"hello";
BOOL b1 = [hello isKindOfClass:[NSObject class]]
BOOL b2 = [hello isKindOfClass:[NSString class]]
3.Objective-C 的包装类
OC提供了NSValue、NSNumber来封装C语言的基本类型,让他们具有面向对象的特征。
3.1 它们不是包装类
- NSInteger:大致等于long型整数
- NSUinteger :大致等于unsigned long型整数
- CFFloat :在64位平台大致相当于double,在32为平台大致相当于float
3.2 NSValue和NSNumber
NSValue和NSNumber都是包装类,NSValue是NSNumber的父类,NSValue代表一个更通用的类,可用于包装单个short、int、long、float、char、指针、对象id等。
NSNumber是更具体的包装类。主要用于包装C语言的各种数值类型,主要方法:
- +numberWithXxx 该类方法直接将特定类型的值包装成NSNumber
- -initWithXxxx 该实例方法需要先创建一个NSNumber对象的实例,再用一个基本类型类初始化NSNumber
- -xxxValue 该实例方法返回该NSNumber对象包装的基本类型的值
xxx可以代表int、char等各种基本类型
NSNumber* num = [NSNumber numberWithInt:20];
NSNumber* de = [NSNumber numberWithDouble:3.4];
//NSLog(@"%d",[num intValue]);
NSLog(@"%g",[de doubleValue]);
NSNumber* ch = [[NSNumber alloc] initWithChar:'J'];
NSLog(@"%@",ch);
4.处理对象
4.1 打印对象和description方法
NSObject类提供的description方法总是返回<类名:16进制的首地址> 这个返回值。自动以自我描述,需要重写NSObject类的description方法
-(NSString *) description
{
return ........
}
4.2 == 和isEqual方法
OC判断相等由两种方法,一种是利用运算符,另一种是isEqual方法
使用类判断两个变量是否相等,如果两个变量是基本类型的变量,并且都是树脂类型,只要两个变量的值相等,判断就返回真。如果是两个指针类型的变量,它们必须指向同一个对象,返回真
isEqual:方法是NSObject提供的一个实例方法,所有指针变量都可以调用该方法判断是否与其他指针变量相等。NSString重写了NSObject的isEqual方法:只要2个字符串包含的字符序列相同,都返回真。
重写isEqual:方法提供自定义的相等标准。
5.类别与扩展
5.1 类别(category)
OC的动态特诊允许使用类别为现有的类添加新方法,不需要创建子类,不需要原有类的源代码。
类别定义由接口和实现部分组成,部分的语法:
@interface 已有类(类别名)
//定义方法
...
@end
@implementation 已有类(类别名)
//方法实现
...
@end
文件命名:头文件:类名+类别名.h 类别实现部分的文件名:类名+类别名.m
5.2 利用类别对类进行模块化设计
5.3 使用类别来调用私有方法
示例如下:
#import <Foundation/Foundation.h>
@interface FKItem:NSObject
@end
@implementation FKItem
-(void) Console:(NSString*) msg
{
NSLog(@"%@",msg);
}
@end
int main(int argc, char const *argv[])
{
@autoreleasepool{
FKItem* item = [[FKItem alloc] init];
[item Console:@"Objective-C"];
}
}
5.4 扩展(extension)
扩展和类别相似,扩展相当于匿名类别,定义语法:
@interface 已有类()
{
实例变量
}
//方法定义
...
@end