我加插件支持我的.净的应用程序。基类听起来合理的,我的,所以人们可以承受它 重写 某些呼吁,以及可以保留默认的功能或者可以使用内部的一些辅助职能。

我为什么会选择接口,而不是一个基插件类继承?你能告诉其设计我应该选择和为什么?

有帮助吗?

解决方案

您应该考虑看看System.Addin(MAF)命名空间或托管扩展框架(MEF)。 MEF是,即使它仍然是预发布,因为它比MAF简单得多的首选。无论这些选择的一个简化了很多的管道工作,你需要为了得到加载插件并与之交互的事情。

至于让一个接口和抽象类之间进行选择,如果你去与MAF或MEF一些的,会为你进行。在这方面最基本的区别是,通过提供一个抽象基类,你的自定义插件(无论是由您或其他开发人员编写的)提供了一个传承点,并确保某些方法/属性提供默认行为,并迫使派生类来实现某些所需的方法/属性。缺点是,你局限于单一的基类。

接口避开单个基类的限制,并且仍然提供用于定制插件的inhertiance点,并确保一定的方法/属性被实现,但不能提供任何类型的默认行为。也可以不指定比在接口公共成员以外的任何而一个抽象类可以具有抽象的或虚拟的非公共成员(通常保护)。

其他提示

使用一个接口插件合同。如果某个类型的插件可能股一定功能,使实现该接口的抽象基类。还确保合同是在组装实际的应用程序之外。

请在.NET中,你没有多重继承。 要求执行者放弃其继承插槽,提供一点点的功能对他们来说不是一个好主意。

为什么它必须是一个或另一个?

您可以定义插件必须遵循作为正被到处引用的接口的合同。

此外,您还可以定义实现该接口的基类,而仅仅具有抽象方法是被调用某些接口功能,你不能提供一个默认的实现。

public interface IPlugin
{
    void Initialize ();
    void Stuff ();
}

public class PluginBase : IPlugin
{
    protected abstract DoInitialize ();
    protected abstract DoStuff ();

    void IPlugin.Initialize { this.DoInitialize (); }
    void IPlugin.Stuff { this.DoStuff (); }
}

有关于这个话题有好的职位: 插件API设计

我个人使用接口,让插件实现的所有细节。

我认为显而易见的事情你应该做的是让插件寄回调(代表们)为个别事件要处理。这是最框架的工作。净

换句话说,这两个基本类别,也没有接口。这种解决方案的优点是,你的插件不必符合任何特定外部的接口或基类,它只是登记册的功能,它的需要。

作为一个例子,"活动"部分,在任何给定的asp.net 控制不会这样说:看看 用户控件

东西,每个人都忘记要提到的是向后兼容性。您可以添加新的方法,以基类不破坏现有的客户,而你不能修改现有的接口,而不会影响他们。

有替代,以避免与接口的兼容性问题。例如,您可以创建一个新的接口,从旧的,当你包括你的应用程序的新扩展继承。但是,这与类型,例如IClientInterfaceV2和IClientInterfaceV3腹胀你的架构的缺点。

我个人的建议是去与像一个通过的 scwagner 的建议的方法,并同时创建一个基类和接口。而包括警告,接口用户指出,未来版本可能会破坏它们的执行和基类继承策略推荐的一个,以避免未来的兼容性问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top