0

我试图理解多态性和继承。我在这方面没有太多经验。我基本上想要做的是有一个通用的 BaseFileLogic 类,可以从包中打开一个文件。我有 BaseFileLogic 类的子类,它们的文件名作为这些特定子类的常量。这个想法基本上适用于从 iTunes 共享中拖动我指定的文件名的人,我可以打开该文件并为我的不同对象类型解析它。所以我的 BaseFileLogic 类非常简单,有一个类和指定的初始化程序:

- (id)initWithFileName:(NSString *)fileName fileLocation:(FileLocation)fileLocation {
    if (self = [super init]) {
        _currentFile = fileName;

        NSString *filePath = nil;
        if (fileLocation == FileLocationBundle) {
            filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"csv"];
        }
        else {
            filePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:_currentFile];            
        }

        _parser = [[CHCSVParser alloc] initWithContentsOfCSVFile:filePath];
        _parser.delegate = self;
    }
    return self;
}

+ (id)baseFileLogicWithFileName:(NSString *)fileName fileLocation:(FileLocation)fileLocation {
    return [[CRBaseFileLogic alloc] initWithFileName:fileName fileLocation:fileLocation ];
}

现在在我的 RoastLogic 课程中,到目前为止我有这个:

@interface CRRoastFileLogic : CRBaseFileLogic

+ (id)roastFileLogicFromFileLocation:(FileLocation)fileLocation;

@end

@implementation CRRoastFileLogic

+ (id)roastFileLogicFromFileLocation:(FileLocation)fileLocation {
CRBaseFileLogic *cr = [CRBaseFileLogic baseFileLogicWithFileName:(NSString *)kRoastFileName fileLocation:fileLocation];
    NSLog(@"cr: %@", [cr description]);
    return cr;
}
@end

当我打印出描述时,cr 对象的类型是 CRBaseFileLogic。我想在这部分我很困惑,因为我想创建一个 CRRoastFileLogic 的实例,但是使用我在超类中声明的方法。继承/多态应该如何工作?

4

1 回答 1

1

在这个方法中

+ (id)baseFileLogicWithFileName:(NSString *)fileName fileLocation:(FileLocation)fileLocation {
    return [[CRBaseFileLogic alloc] initWithFileName:fileName fileLocation:fileLocation ];
}

你有问题。因为它总是返回一个实例CRBaseFileLogic

所以像这样改变它应该可以解决问题

+ (id)baseFileLogicWithFileName:(NSString *)fileName fileLocation:(FileLocation)fileLocation {
    return [[self alloc] initWithFileName:fileName fileLocation:fileLocation ];
}

那么如果你这样称呼selfCRRoastFileLogic[CRRoastFileLogic baseFileLogicWithFileName...]

于 2013-05-30T04:11:34.723 回答