【问题标题】:Factory pattern - how to generate empty class decleration in factory class工厂模式 - 如何在工厂类中生成空类声明
【发布时间】:2014-05-25 09:23:13
【问题描述】:

我有一个工厂类,它有一个类似的 init 方法

+(instancetype)initWithDictionary:(NSDictionary);

在实现中类似于

@class ClassA,ClassB,ClassC,.... lots and lots of classes; // like 20+
@implementation

+(instancetype)initWithDictionary:(NSDictionary *)dictionary
{
    NSString *factoryKey = dictionary[@"some useful key to create a class"];
    Class theCorresondingClass = [self classForKey:factoryKey];
    return [[theCorrespondingClass alloc] initWithDictionary:dictionary];
}

-(Class)classForKey:(NSString *)key
{
    static NSDictionary *classesDictionary;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSArray *classes = [[ClassA class],[ClassB class],[....],.....]; // the 20+ class from above
        NSArray *keysForClasses = [@"KeyA",@"KeyB,....]; // the 20 keys for the classes
        classesDictionary = [NSDictionary dictionaryWithObjects:classes forKeys:keysForClasses];
    }
    return classesDictionary[key];

}

问题是我从前向声明中分配初始化(在字典中这是一个错误),这是一个编译时错误 - 我认为唯一可能的解决方案是将所有类导入工厂 - 这看起来像糟糕的举动——因为理想情况下我希望工厂支持其他类的注册——这样它将在运行时创建这些类——或者定义工厂中的所有类——这似乎更糟——

问题是所有类都继承自一个公共基类,所以我知道在运行时它会被正确定义(alloc init 方法)-

有什么方法可以对类名进行@dynamic 定义吗?也许创建一个宏来存根工厂类中的空类?

苹果是如何在NSTextCheckingResult.h factory 做这样的事情的?

【问题讨论】:

    标签: objective-c dynamic runtime forward-declaration


    【解决方案1】:

    您可以使用NSClassFromString 动态获取类。

    classesDictionary 会将键映射到类名:

    classesDictionary = @{ @"KeyA" : @"NSString",
                           @"KeyB" : @"NSNumber" };
    

    然后获取给定类名的 Class 对象:

    Class theClass = NSClassFromString(classesDictionary[key]);
    

    您可能需要执行额外的检查以确保 Class 对象是您期望的值。例如

    if ([theClass isSubclassOfClass:[MyBaseClass class]])
        Etc...
    

    然后您只需将标头包含到公共基类中。

    【讨论】:

    • 好的,所以将它们存储为字符串?我会放松编译检查吗?
    • 是的,这就是权衡。这就是为什么你应该检查 NSClassFromString 的返回值以确保你有一个有效的类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多