iOS:使用工厂设计模式动态更改可访问属性?
iOS: Using the Factory Design Pattern to Dynamically Change Accessible Properties?
我有以下示例,其中 CarTypeTesla
是一个枚举值。
Car *car = [Car carOfType:CarTypeTesla];
+ (instanceType)carOfType:
进行枚举检查并 returns 给定 Car
子类的实例,如下所示:
+ (instanceType)carOfType:(CarType)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);
如何使用此工厂设计模式,根据提供的枚举值仅显示与返回的子类相关的属性/方法(使用 CarTypeTesla
时不想显示 -(float)gasFuelRemaining
?
您正在实施的是 iOS 中的 class 集群。一些框架 classes,比如 NSArray、NSString 和 NSDictionary 就是这样工作的(它们通过根据它们持有的数据量提供不同的解决方案来进行优化)。这允许您拥有一个通用的、通用的 class 公开给 API,同时隐藏与开发人员不一定相关的解决方案的所有复杂细节,包括基于上下文不同但应该行为相同。这意味着您拥有一个通用基础 class,其中包含在所有其他隐藏 class 中实现的通用方法。
按照我的看法,您必须选择:
1 - 您在所有汽车 classes 中实施所有方法,并在它们不相关时让它们 return 为空值,在这种情况下,您的 Tesla
实例将 return 0对于 gasFuelRemaining
或
2 - 您为不同类型的汽车实施协议,例如 ElectricCarProtocol
和 FuelCarProtocol
,并且在您的 Car
class 中有一个名为 fuelRemaining
的通用方法这行:
if ([self conformsToProtocol:@protocol(ElectricCarProtocol)]) {
return self.batteryChargeRemaining; // you might need to cast the object here
}
return self.gasFuelRemaining; // idem
希望对您有所帮助!
我有以下示例,其中 CarTypeTesla
是一个枚举值。
Car *car = [Car carOfType:CarTypeTesla];
+ (instanceType)carOfType:
进行枚举检查并 returns 给定 Car
子类的实例,如下所示:
+ (instanceType)carOfType:(CarType)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);
如何使用此工厂设计模式,根据提供的枚举值仅显示与返回的子类相关的属性/方法(使用 CarTypeTesla
时不想显示 -(float)gasFuelRemaining
?
您正在实施的是 iOS 中的 class 集群。一些框架 classes,比如 NSArray、NSString 和 NSDictionary 就是这样工作的(它们通过根据它们持有的数据量提供不同的解决方案来进行优化)。这允许您拥有一个通用的、通用的 class 公开给 API,同时隐藏与开发人员不一定相关的解决方案的所有复杂细节,包括基于上下文不同但应该行为相同。这意味着您拥有一个通用基础 class,其中包含在所有其他隐藏 class 中实现的通用方法。
按照我的看法,您必须选择:
1 - 您在所有汽车 classes 中实施所有方法,并在它们不相关时让它们 return 为空值,在这种情况下,您的 Tesla
实例将 return 0对于 gasFuelRemaining
或
2 - 您为不同类型的汽车实施协议,例如 ElectricCarProtocol
和 FuelCarProtocol
,并且在您的 Car
class 中有一个名为 fuelRemaining
的通用方法这行:
if ([self conformsToProtocol:@protocol(ElectricCarProtocol)]) {
return self.batteryChargeRemaining; // you might need to cast the object here
}
return self.gasFuelRemaining; // idem
希望对您有所帮助!