我有以下示例,其中 CarTypeTesla 是一个枚举值。
Car *car = [Car carOfType:CarTypeTesla];
+ (instanceType)carOfType: 进行枚举检查并返回给定 Car 子类的实例,如下所示:
+ (instanceType)carOfTypeCarType)carType {
switch (carType) {
case: CarTypeTesla: {
return [[Tesla alloc] init];
}
case: CarTypeMustang: {
return [[Mustang alloc] init];
}
}
}
这样就可以在主文件中完成类似的操作(而且我不必公开我的 Tesla、Mustang 和其他 20 个子类):
Car *car = [Car carOfType:CarTypeTesla];
NSLog(@"%@", car.batteryChargeRemaining);
或
Car *car = [Car carOfType:CarTypeMustang];
NSLog(@"%@", car.gasFuelRemaining);
我怎样才能使用这个工厂设计模式,根据提供的枚举值仅显示与返回的子类相关的属性/方法(使用时不想显示 -(float)gasFuelRemaining CarTypeTesla ?
Best Answer-推荐答案 strong>
您所实现的在 iOS 中被称为类集群。一些框架类,如 NSArray、NSString 和 NSDictionary 就是这样工作的(它们通过根据它们持有的数据量提供不同的解决方案进行优化)。这允许您拥有一个向 API 公开的通用通用类,同时隐藏与开发人员不一定相关的解决方案的所有复杂细节,包括基于上下文不同但行为相同的解决方案。这意味着您有一个通用基类,其中包含在所有其他隐藏类中实现的通用方法。
在我看来,您必须选择:
1 - 您在所有汽车类中实现所有方法,并在它们不相关时让它们返回空值,在这种情况下,您的 Tesla 实例将为 gasFuelRemaining 返回 0 或
2 - 您为不同类型的汽车实现协议(protocol),例如 ElectricCarProtocol 和 FuelCarProtocol 并在您的 Car 类中有一个通用方法,称为 fuelRemaining 做一些类似这样的事情:
if ([self conformsToProtocolprotocol(ElectricCarProtocol)]) {
return self.batteryChargeRemaining; // you might need to cast the object here
}
return self.gasFuelRemaining; // idem
希望这会有所帮助!
关于iOS:使用工厂设计模式动态更改可访问属性?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/30368308/
|