3

我的桌面应用程序有一个插件架构。我已经使用Apple 的代码加载指南以相当标准的方式实现了它。

我有一个协议,它定义了插件实例可以或应该响应的所有方法。

唯一的问题是这个协议定义了大约 80 种方法。这些方法中只有大约 10 种是强制性的,其余的都是可选的。一些插件将实现所有 80 种方法,而其他插件将只实现基本的 10 种。

插件包告诉其宿主应用程序实例化哪个类的常用方法是通过NSPrincipalClass其 Info.plist 文件中的键。这是一个键,因此只能实例化一个类。

插件协议是一个单独的文件,预计它将被这个单一的类使用。

我的问题是:将这个单一协议中的功能拆分为多个协议的最佳方法是什么,同时允许插件编写者拥有更灵活的实现?

目前,我现有的插件在其主体类中有以下内容:

- (BOOL)respondsToSelector:(SEL)selector {
    return [self forwardingTargetForSelector:selector] ? YES : NO;
}

- (id)forwardingTargetForSelector:(SEL)selector {
    id target = nil;
    if ([self.instanceOne respondsToSelector:selector]) {
        target = self.instanceOne;
    } else if ([self.instanceTwo respondsToSelector:selector]) {
        target = self.instanceTwo;
    } else if ([self.instanceThree respondsToSelector:selector]) {
        target = self.instanceThree;
    }

    return target;
}

但是,与其将它强加给插件编写者来定义这样的临时系统,我希望应用程序的插件框架能够容纳更灵活的解决方案。

4

1 回答 1

1

如果您可以将 80 种方法划分为合理的功能块,则可以将它们拆分为多个协议(FooProtcolBarProtocol等)并定义可选属性,这些属性返回对在您的主协议中实现它们的对象的引用。例如:

@protocol PluginPrimaryProtocol <NSObject>
@required
/* ... */
@optional
@property (readonly) id<FooProtocol> fooDelegate;
@property (readonly) id<BarProtocol> barDelegate;
/* ... */
@end
于 2012-06-12T12:18:01.887 回答