• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS:使用工厂设计模式动态更改可访问属性?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 07:21:13 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有以下示例,其中 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap