我正在为我的.NET应用程序添加插件支持.基类对我来说听起来很合理,所以人们可以继承它并覆盖某些调用,也可以保留默认功能或者可以使用一些内部帮助函数.
为什么我要选择接口而不是基础插件类来继承?你能说出我应该选择哪种设计以及为什么?
您应该考虑查看System.Addin(MAF)命名空间或Managed Extensibility Framework(MEF).MEF将是首选,即使它仍然是预发布的,因为它比MAF简单得多.这些选择中的任何一个都简化了为了使加载项加载并与它们交互而需要执行的大量管道工作.
至于在接口和抽象类之间做出选择,如果你使用MAF或MEF,那么将为你做一些.此上下文中最基本的区别在于,通过提供抽象基类,您可以为自定义插件(由您或其他开发人员编写)提供继承点,并确保某些方法/属性提供默认行为并强制派生类实现某些所需的方法/属性.缺点是您只能使用一个基类.
接口绕过单个基类限制,仍然为自定义插件提供了一个插入点,并确保实现某些方法/属性,但不能提供任何类型的默认行为.除了抽象类可以具有抽象或虚拟非公共成员(通常是受保护的)之外,您还不能在接口中指定除公共成员之外的任何内容.