我清楚地记得,有一次,微软推动的指南是将“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
这就是我能在几秒钟内鼓起来的东西。所以我去查看官方文档说的内容,以确保我没有疯狂。我在Names of Classes, Structs, and Interfaces的MSDN上找到了Design Guidelines for Developing Class Libraries。奇怪的是,我没有提到将“Base”添加到抽象类名称末尾的准则。并且该指南不再适用于框架1.1版。
所以,我输了吗?该指南是否存在?是不是一言不发就被遗弃了?过去两年我一直在为自己创造长篇名字吗?
有人在这里给我一块骨头。
更新 我没疯。该指南已存在。 Krzysztof Cwalina gripes about it in 2005.
答案 0 :(得分:63)
在Framework Design Guidelines p 174州:
如果要在公共API中使用该类,请避免使用“Base”后缀命名基类。
另外:http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx
答案 1 :(得分:19)
此外,如果抽象类有一些静态成员将被使用,'Base'可能会变得难看。
答案 2 :(得分:14)
我不记得这样的指导方针。我相信你应该使用有意义的命名。有时抽象类只是为某些类(作为工具)提供通用功能,我认为应该有后缀。但是,在某些情况下,您希望将其用作多态性层次结构的基础,而这种层次结构本身并不完整。在这些情况下,我建议像普通班级一样命名。
如您所见,您可能不会声明一个接受ButtonBase作为参数的方法。它旨在为子类提供最小的功能。但是,您可以将ConfigurationElement
视为具有不同形式的实体,但它本身并不完整(因此它是抽象的)
答案 3 :(得分:10)
有时Base仍然是必要的,特别是当你提供具体类和抽象类以供某人扩展以创建具体实现时。 例如控制器和ControllerBase (实际上Controller也是抽象的,但提供比ControllerBase更多的功能)
对接口进行编程时,基本后缀很难看,所以我认为不使用它的Microsoft指南适用于抽象类主要像接口一样使用的情况。可能是Public API的含义。
关键是有些情况下没有更好的替代方法来使用Base后缀。
答案 4 :(得分:1)
我理解避免Base-Suffix的倾向,但我也理解某些后缀的必要性。现在,评论of this article建议使用" Type"作为后缀作为不使用任何的第二选择。我认为这是令人困惑的,但是这个非承诺词的想法往往表明它是一个非承诺的类"坚持我。
作为替代选择:我更喜欢使用" Kind"作为后缀将对象声明为“属于或属于指定的种族或家庭”(Wiktionary: -kind)。
示例:DataProvider
和ReflectiveDataProvider
都是DataProviderKind
受生物学启发,例如: " canis lupus"属于家庭" Canoidea",非常粗略地翻译为" dog-ish"。
答案 5 :(得分:1)
Microsoft声明:
"✓考虑使用基类的名称结束派生类的名称。这是非常易读的,并清楚地解释了这种关系。代码中的一些示例是:ArgumentOutOfRangeException,它是一种Exception,以及SerializableAttribute,它是一种Attribute。但是,在应用本指南时使用合理的判断非常重要;例如,Button类是一种Control事件,虽然Control不会出现在其名称中。"
一般来说,这隐含地排除了使用" Base"在名称中。