今天复习了一下多态,下面贴一段代码。
//练习二:父类:打印机 子类:彩色打印机 、黑白打印机
// Printer.h
#import <Foundation/Foundation.h>
//@class 在父类中引用,为了找到子类的相关方法
@class ColorPrinter;
@class BlackPrinter;
//声明一个Printer类,该类继承自NSObject
@interface Printer : NSObject
//非多态写法
//声明一个setBlackPrint的对象方法,去调用BlackPrinter类的方法去执行print;
- (void) setBlackPrint:(BlackPrinter *)blackPrinter;
//声明一个setColorPrint的对象方法,去调用ColorPrinter类的方法去执行print;
- (void) setColorPrint:(ColorPrinter *)colorPrinter;
//多态写法
//声明一个setPrinter的对象方法,去调用Printer类的方法去执行print;
- (void) setPrinter:(Printer *)printer;
@end
// Printer.m
#import "Printer.h"
#import "BlackPrinter.h"
#import "ColorPrinter.h"
@implementation Printer
//非多态写法
//实现setBlackPrint方法,对象blackPrinter执行print;
- (void) setBlackPrint:(BlackPrinter *)blackPrinter{
[blackPrinter print];
}
//实现setColorPrint方法,对象colorPrinter执行print;
- (void) setColorPrint:(ColorPrinter *)colorPrinter{
[colorPrinter print];
}
//多态写法
//实现setPrinter方法,对象printer执行print;
- (void) setPrinter:(Printer *)printer{
[printer print];
}
//父类里的print方法
- (void) print{
NSLog(@"打印机父类");
}
@end
// ColorPrinter.h
#import <Foundation/Foundation.h>
#import "Printer.h"
@interface ColorPrinter : Printer
//声明print方法,暴露接口
- (void) print;
@end
// ColorPrinter.m
#import "ColorPrinter.h"
@implementation ColorPrinter
//实现print方法
- (void) print{
NSLog(@"彩色打印机");
}
@end
// BlackPrinter.h
#import <Foundation/Foundation.h>
#import "Printer.h"
@interface BlackPrinter : Printer
//声明print方法,暴露接口
- (void) print;
@end
// BlackPrinter.m
#import "BlackPrinter.h"
@implementation BlackPrinter
//实现print方法
- (void) print{
NSLog(@"黑白打印机");
}
@end
// main.m
#import <Foundation/Foundation.h>
//x需要引入类的头文件,才能去实现其中的方法和属性
#import "Printer.h"
#import "BlackPrinter.h"
#import "ColorPrinter.h"
int main(int argc, const char * argv[]) {
//非多态写法: 各自在父类中创建好调用子类的方法
//分别实例化出三个类的对象
BlackPrinter *blackPrinter = [[BlackPrinter alloc]init];
ColorPrinter *colorPrinter = [[ColorPrinter alloc]init];
Printer *printer = [[Printer alloc]init];
//子类的对象去调用子类的方法
[printer setBlackPrint: blackPrinter];
[printer setColorPrint: colorPrinter];
//多态写法:直接用父类的指针指向了子类的对象,也就是说根据传入的对象判断对象方法,再而调用对象方法。
//因为printer是父类实例化出来的对象,可以通过多态的方式去使用子类的方法
[printer setPrinter: blackPrinter];
[printer setPrinter: colorPrinter];
[printer setPrinter: printer];
return 0;
}
上面的例子是一个彩色打印机和黑白打印机这两种打印机,然后Person类中有一个操作打印的方法,这个方法是需要打印机对象的,如果不用多态机制实现的话,就是给两种打印机单独定义个操作的方法,也就是main.m文件中 [printer setBlackPrint: blackPrinter];
然后在Person.m中用具体的打印机对象进行操作[blackPrinter print];,在main.m文件中,我们看到,当Person需要使用哪个打印机的时候,就去调用指定的方法:[printer setPrinter: blackPrinter];
这样子的好处是:
如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,用一个方法接收所有的子类而不用再去定义多个函数来和相应的类进行匹配了( 做到简化代码 ,方法的节省)。
还有一个是@class,昨天上课没有注意到这个细节,class是放在interface中的,只是在引用一个类,将这个被引用类作为一个类型,在实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类。
今天的重点还有OC语言的数据结构类型
//NSString 不可变的字符串
//NSMutableString 可变的字符串
//申请一块空间,返回一个空字符串:
NSMutableString *echoII = [NSMutableString string];
//返回一个空字符串,申请一个初始存储空间,可自动增长。
NSMutableString *echoIII = [NSMutableString stringWithCapacity:10];
//追加字符串 append
[echoII appendString:@"Hello"];
//查找相关的字符串
NSRange range = [echoII rangeOfString:@"H"];
//location代表找到的开始位置,length代表找到的长度,最小为0
NSLog(@"%lu , %lu", range.length , range.location );
//删除字符串 delete
[echoII deleteCharactersInRange:range];
//替换字符串
NSString *echoIIII= [echoII stringByReplacingOccurrencesOfString:@"el" withString:@"111111"];
//判断两个字符串是否相等
[stringI isEqualToString:stringII]
// 数组包括 不可变数组 NSArray 和 可变数组 NSMutableArray
//数组即相同数据类型的有序集合,数组有下标,下标从0开始
NSArray *echoArray = @[ @"1", @"2" ];
//不可变是不可改变相关数组的序列
NSLog(@"%@", echoArray[1] );
//可变需要申请一块内存空间
NSMutableArray *echoMutableArray = [NSMutableArray array];
//申请初始的内存空间,返回一个空Array
NSMutableArray *echoMutableArrayI = [NSMutableArray arrayWithCapacity:10];
//把不可变的Array变成可变的Array
NSMutableArray *echoMutableArrrayII= [NSMutableArray arrayWithArray: echoArray];
//如果初始长度为2,那追加一个数据到可变数组里此事的长度为3,也就是最大下标就是2 ,追加用add
[echoMutableArrrayII addObject:@"3"];
//得到相关的数组的长度[echoMutableArrrayII count]
NSLog(@"%@, %li", echoMutableArrrayII[2], [echoMutableArrrayII count]);
//删除用remove
[echoMutableArrrayII removeObject:@"2"];//移除某一个元素
//[echoMutableArrrayII removeAllObjects];//移除全部
//替换某个下标的数据 为 某个数
[echoMutableArrrayII replaceObjectAtIndex:1 withObject:@"15"];
//查找某个下标的数据 遍历查找 echoMutableArrrayII[下标] C的写法
for( int i = 0 ; i < [echoMutableArrrayII count]; i++ ){
NSLog(@"for:%@", echoMutableArrrayII[i] );
}
// NSLog(@"%@, %li", echoMutableArrrayII[1], [echoMutableArrrayII count]);
//判断2个数组是否相等
NSArray *arrayII = @[@"1"];
NSArray *arrayIII = @[@"1"];
if( [arrayII isEqualToArray: arrayIII] ){
NSLog( @"Success" );
}else{
NSLog( @"Error" );
}
这些基础知识主要还是需要多练习,去熟悉。
最后还有字典的学习。
//不可变字典NSDictionary;字典是由键值对构成;字典的基本形式是@{@"KEY":@"VALUE",@"KEY":@"VALUE"}
//定义一个不可变字典
NSDictionary *dict=@{@"2":@"23"};
//对于一个字典他们的键可以是:id、NSNumber、NSString、NSArray、NSDictionary类型,同理,其值类型也是可以为NSString、NSArray、NSDictionary等
// 获取到所有键的值
NSLog(@"%@",[dict1 allKeys]);
// 获取到所有值(value)的值
NSLog(@"%@",[dict allValues]);
// 字典的获取方式
NSLog(@"%@",dict[@"2"]);
//可变字典NSMutableDictionary
//可变:增加了一些增删查改的方法
// 可变字典的定义方式
1、// 1、给一个空间2、设置值
NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] initWithCapacity:10];
//设置添加键值对的两种方法:setObject时forKey时候其参数为id类型,setValue的时候forKey部分参数为NSString类型
[mutableDic setObject:@"name" forKey:@1];
[mutableDic setValue:@"jiaolong" forKey:@"name"];
2、
NSArray *keys = @[@"key1",@"key2",@"key3"];
NSArray *values = @[@"value1",@"value2",@"value3"];
NSMutableDictionary *dic3 = [[NSMutableDictionary alloc] initWithObjects:values forKeys:keys];
//添加现有的字典数据,这是对可变字典操作的,将一个不可变的字典加在可变字典中,可变字典的对象去调用对象方法:addEntriesFromDictionary:
[mutableDic addEntriesFromDictionary:dic3];
// 添加新的键值对象
[mutableDic setValue:@"set1" forKey:@"setKey1"];
NSLog(@"set value for key :%@",mutableDic);
// 根据key删除value,一次删除一个
[mutableDic removeObjectForKey:@"key1"];
//根据key删除value,一次删除多个
[mutableDic removeObjectsForKeys:@[@"key3",@"name"]];
//删除所有键值对
[mutableDic removeAllObjects];