我有一个包含异构项目的大列表(数组)的数据模型。只有 2-3 种不同的项目,每一种都继承自一个基类。使用经典示例,假设基类是 Vehicle ,子类是 CarTrainPlane

我有一个更大的拥有模型/ Controller 想要对这个有序的 Vehicles 列表进行操作,虽然一些操作是共享的(并且在基类中并在子类中被覆盖),但许多操作只特定于其中一个物品的种类。

所以我最终得到了很多看起来像这样的代码:

for (Vehicle * vehicle in vehicles) {
    if (![vehicle isKindOfClass:[Car class]]) {
         continue;
    }
    Car * car = (Car *)vehicle;

    // Do stuff only with "car".
}

所以我到处都有很多 -isKindOfClass: 并且很多将基类转换为子类。当然,这一切都有效,但似乎有足够的“代码味道”让我认为可能有一种更优雅的方式来编写此代码或设计我的对象模型。

想法?谢谢。

最佳答案

我将消除强制转换并使用一组过滤集合的方法来隔离 isKindOfClass 检查以仅包含所需类型的元素。

标题:

@interface VehicleManager : NSObject {
    @private
    NSArray *vehicles;
}

@property (readonly) NSArray *vehicles;
@property (readonly) NSArray *cars;
@property (readonly) NSArray *planes;
@property (readonly) NSArray *trains;
@end

实现文件:
@implementation VehicleManager
@synthesize vehicles;

static NSArray *MyFilterArrayByClass(NSArray *array, Class class) {
    NSMutableArray *result = [NSMutableArray array];
    for (id object in array) {
        if ([object isKindOfClass:class]) {
            [result addObject:object];
        }
    }
    return result;
}

- (NSArray *)cars {
    return MyFilterArrayByClass([self vehicles], [Car self]);
}

- (NSArray *)planes {
    return MyFilterArrayByClass([self vehicles], [Plane self]);
}

- (NSArray *)trains {
    return MyFilterArrayByClass([self vehicles], [Train self]);
}

- (BOOL)areAllCarsParked {
    BOOL allParked = YES;
    for (Car *car in [self cars]) {
        allParked = allParked && [car isParked];
    }
    return allParked;
}

@end

关于objective-c - cocoa 风格 : using polymorphism in collections,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5752144/

10-12 02:01