我的桌面应用程序有一个插件架构。我已经使用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;
}
但是,与其将它强加给插件编写者来定义这样的临时系统,我希望应用程序的插件框架能够容纳更灵活的解决方案。