如下所述,超类,名称为ZpIOObject
typedef NS_OPTIONS(NSUInteger, ZpIOObjectType) {
ZpIOObjectType_NONE = 0 , // is no exist file or no judgment object type
ZpIOObjectType_File , // it's a file object
ZpIOObjectType_Document // it's a document object
};
@interface ZpIOObject:NSObject
@property (nonatomic , assign ) ZpIOObjectType fileType ;
@property (nonatomic , strong ) NSString *absolutePathString ;
/**create an object or subobject*/
+(instancetype) ioObjectWithAbsolutePathString:(NSString *)absolutePathString ;
@end
子类,名称为ZpIOFileObject
@interface ZpIOFileObject : ZpIOObject
- (void)fileDataWithAsynchronize:(void(^)(NSData *fileData))result ;
@end
另一个子类,名称是ZpIODocumentObject
@interface ZpIODocumentObject : ZpIOObject
@property (nonatomic , strong , readonly) NSArray<ZpIOObject*> *subIOObjects ;
@end
@implementation ZpIODocumentObject
@synthesize subIOObjects = _subIOObjects ;
- (NSArray<ZpIOObject *>*)subIOObjects
{
if( nil == self.absolutePathString || YES == [[self.absolutePathString trim] isEqualToString:emptyString] ){
return nil ;
}
if( nil != self.error ){
return nil ;
}
// 进行IO操作,获取最新的文件当前层级的子文件、子文件夹,一定是最新数据,但对IO开销大
NSFileManager *fileManager = [NSFileManager defaultManager] ;
NSError *error ;
NSArray<NSString*>* subDirsNameArr = [fileManager contentsOfDirectoryAtPath:self.absolutePathString error:&error] ;
if( nil == subDirsNameArr || 0 == [subDirsNameArr count] ){
return nil ;
}
for( NSString *subFilePathString in subDirsNameArr ){
NSMutableString *subFileAbsolutePathString = [[NSMutableString alloc] initWithString:subFilePathString] ;
[subFileAbsolutePathString appendString:[NSString stringWithFormat:@"/%@",subFilePathString]] ;
ZpIOObject * ioobject = [ZpIOObject ioObjectWithAbsolutePathString:subFileAbsolutePathString] ;
switch ( ioobject.fileType ) {
case ZpIOObjectType_File:{
; // How to convert ZpIOObject to ZpIOFileObject ??????
}
case ZpIOObjectType_Document:{
; // How to convert ZpIOObject to ZpIODocumentObject ??????
}
break;
default:{/*do nothing*/}break ;
}
}
return nil ;
}
@end
您可以看到以下代码:
switch ( ioobject.fileType ) {
case ZpIOObjectType_File:{
; // How to convert ZpIOObject to ZpIOFileObject ??????
}
case ZpIOObjectType_Document:{
; // How to convert ZpIOObject to ZpIODocumentObject ??????
}
break;
default:{/*do nothing*/}break ;
}
我想将ZpIOObject转换为ZpIOFileObject / ZpIODocumentObject。
我认为你会认为这么容易: 创建ZpIOFileObject / ZpIODocumentObject并赋值。 例如:
ZpIOFileObject *fileObject = [[ZpIOFileObject alloc] init] ;
fileObject.property = ioobject.property
... do something ...
不,不!我不想要这个。
我想要一个超类转换为子类,为什么? 在我看来,ioObject是一个现有的对象,create(alloc)一个新对象(例如[[ZpIOFileObject alloc] init])是浪费内存资源!
我不忍心浪费内存资源!
所以,我的问题是:
如果超类是现有对象,如何将超类'对象转换为子类'对象?
答案 0 :(得分:1)
我确信,经过长时间的测试,不能这样做。
子类&#39;对象可以转换为超类&#39;对象,但超类&#39;对象无法转换为子类&#39;对象。
for example :
A inheritance ASuper
A *a = [[A alloc] init] ;
ASuper * aSuper = a ; // right
A *aAnother = (A *) aSuper ; // right
ASuper * aSuperAnother = [[ASpuer alloc]init] ;
A *a_other = aSuperAnother ; // Error !