在我看来,能够一眼就知道一个类是抽象的并且不打算直接实例化就像它能够轻松识别接口一样有用。
我的问题是,为什么没有“AFourLeggedAnimal:IAnimal”流行?是否仅仅因为可能的混淆(我在编写时就注意到了这一点)例如将其混淆为“四足动物”而不是“抽象类FourLeggedAnimal”?还是更多的东西?
从学校的Java到C#工作,我发现“I”前缀命名约定在浏览类列表时非常有用,在我看来,能够区分具体和非具体的课程一目了然,无需查看代码。
答案 0 :(得分:14)
使用后缀“Base”作为Joel提及。一旦你的项目中有很多东西,很容易区分:
public abstract AnimalBase
{
public AnimalType AnimalType { get; set; }
}
public abstract HorseBase : AnimalBase
{
public HoovesManufacturer HoovesManufacturer { get; set; }
}
public class Pony : HorseBase
{
public Pony()
{
}
}
答案 1 :(得分:13)
我更喜欢以“Base”为后缀。
答案 2 :(得分:4)
因为,坦率地说,已经设置了用于命名抽象类的接受模式;-)它具有“Base”后缀,如MyControlBase或FooBase。
-Oisin
答案 3 :(得分:2)
在Java中,许多“抽象”类以“抽象”为前缀,例如 - AbstractList等。
最后,为什么一个人只需要通过阅读它的名字来了解一个类是否是抽象的。只有这么多的细节可以在它们变得很长之前塞进一个类名。
我个人觉得接口的“I”前缀也很丑陋。我相信不应该尝试在类名中对这些细节进行编码。我相信通过将实现细节与接口名称相结合,我们可以找到真正有意义的短名称。一个完美的例子是Java的Map,HashMap等都非常具有描述性和简洁性。
答案 4 :(得分:1)
I前缀很难看,但不幸的是,这是微软的惯例。 在理想的世界中,我们都应该对接口进行编程。具体的类有一个后缀Impl或者它们可以区别于接口或抽象类(我们不关心因为我们的IoC容器会为我们处理它!)
e.g。 Book将是一个接口或抽象类,它无关紧要。 我们大多数时候都会编写好名字。要使用的实际实现可以从配置文件中轻松插入。
但是,唉,我们并没有生活在这样一个理想的世界里。