我清楚地记得,有一次,微软推动的指导原则是将"Base"后缀添加到抽象类中,以避免它是抽象的事实.因此,我们有类,如System.Web.Hosting.VirtualFileBase
,System.Configuration.ConfigurationValidatorBase
,System.Windows.Forms.ButtonBase
,,当然,System.Collections.CollectionBase
.
但是我注意到,最近,框架中的许多抽象类似乎都没有遵循这个约定.例如,以下类都是抽象的,但不遵循此约定:
System.DirectoryServices.ActiveDirectory.DirectoryServer
System.Configuration.ConfigurationElement
System.Drawing.Brush
System.Windows.Forms.CommonDialog
这就是我几秒钟内就可以鼓起来的东西.所以我去查看官方文档说的内容,以确保我没有疯狂.我在开发类库的设计指南中找到了MSDN上的类,结构和接口的名称.奇怪的是,我没有提到在抽象类名称的末尾添加"Base"的指南.该框架的1.1版已不再适用该指南.
那么,我输了吗?该指南是否存在?是不是一言不发就被遗弃了?在过去的两年里,我一直在为自己创造长篇名字吗?
有人在这里给我一个骨头.
更新 我不是疯了.该指南已存在.Krzysztof Cwalina在2005年抱怨它.
在框架设计指南中,第174页指出:
如果该类旨在用于公共API,则避免使用"Base"后缀命名基类.
另外:http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx
此外,如果抽象类有一些将使用的静态成员,'Base'可能会变得丑陋.
我不记得这样的指导方针.我相信你应该使用有意义的命名.有时抽象类只是为某些类(作为工具)提供通用功能,我认为应该有后缀.但是,在某些情况下,您希望将其用作多态性层次结构的基础,而这种层次结构本身并不完整.在那些情况下,我建议像普通班级一样命名.
如您所见,您可能不会声明一个接受ButtonBase作为参数的方法.它旨在为子类提供最小的功能.但是,您可以将a ConfigurationElement
视为具有不同形式的实体,但它本身并不完整(因此它是抽象的)
有时Base仍然是必需的,特别是当你提供具体类和抽象类以供某人扩展以创建具体实现时.
例如Controller和ControllerBase(实际上Controller也是抽象的,但提供比ControllerBase更多的功能)
在对接口进行编程时,基本后缀很难看,所以我认为不使用它的Microsoft指南适用于抽象类主要像接口一样使用的情况.可能是Public API的含义.
关键是有些情况下没有更好的替代方法来使用Base后缀.