OStack程序员社区-中国程序员成长平台

标题: iOS:使用工厂设计模式动态更改可访问属性? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 07:21
标题: iOS:使用工厂设计模式动态更改可访问属性?

我有以下示例,其中 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-推荐答案


您所实现的在 iOS 中被称为类集群。一些框架类,如 NSArray、NSString 和 NSDictionary 就是这样工作的(它们通过根据它们持有的数据量提供不同的解决方案进行优化)。这允许您拥有一个向 API 公开的通用通用类,同时隐藏与开发人员不一定相关的解决方案的所有复杂细节,包括基于上下文不同但行为相同的解决方案。这意味着您有一个通用基类,其中包含在所有其他隐藏类中实现的通用方法。

在我看来,您必须选择: 1 - 您在所有汽车类中实现所有方法,并在它们不相关时让它们返回空值,在这种情况下,您的 Tesla 实例将为 gasFuelRemaining 返回 0 或 2 - 您为不同类型的汽车实现协议(protocol),例如 ElectricCarProtocolFuelCarProtocol 并在您的 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4