C# 如果没有抽象成员,基类是否应该标记为抽象?

C# 如果没有抽象成员,基类是否应该标记为抽象?,c#,java,abstract-class,C#,Java,Abstract Class,如果一个类没有抽象成员,它可以被标记为抽象类吗?即使没有实际的理由直接实例化它?(除了单元测试之外)您希望该类有一个实际的实例吗?如果是,则不要将其标记为抽象。如果否,则将其标记为抽象。是的,将不应实例化的基类显式标记为抽象是合理且有益的,即使在没有抽象方法的情况下也是如此 它强制执行使非叶类抽象的通用准则 它阻止其他程序员创建该类的实例。这可能使您以后更容易向其中添加抽象方法 简短回答:是 长答案:abstract关键字将类和/或其成员标记为不直接有用。原因可能因情况而异;抽象类可能过于基本

如果一个类没有抽象成员,它可以被标记为抽象类吗?即使没有实际的理由直接实例化它?(除了单元测试之外)

您希望该类有一个实际的实例吗?如果是,则不要将其标记为抽象。如果否,则将其标记为抽象。

是的,将不应实例化的基类显式标记为抽象是合理且有益的,即使在没有抽象方法的情况下也是如此

  • 它强制执行使非叶类抽象的通用准则
  • 它阻止其他程序员创建该类的实例。这可能使您以后更容易向其中添加抽象方法
      简短回答:是


      长答案:
      abstract
      关键字将类和/或其成员标记为不直接有用。原因可能因情况而异;抽象类可能过于基本,无法执行任何实际工作,或者它可能具有抽象成员,这些成员必须存在,才能使该类中的其他代码正常工作,但不能在此级别进行具体定义。它的缺点是,通过标记一个类抽象,您告诉编译器和其他开发人员不要直接实例化这个类,而是从它继承来创建一个具体有用的实现。即使类的所有成员都有一个有效的实现,如果您觉得必须继承该类才能最好地利用该实现,也可以这样做。

      是的,我认为是这样。至少我经常这样做;-)

      如果目标是创建一个其他类将扩展的基类,那么将其作为一个抽象类是有意义的


      但是,如果目标是生成某种形式的实用程序类——一个只有
      静态
      成员的类——那么处理这个问题的最佳方法就是给这个类一个标记为
      私有
      的构造函数。这样,类就不能被实例化,也不能被子类化。这发出了一个明确的信号,即类的唯一用途是使用其
      静态方法。(这是Josh Bloch的《高效Java》的提示)

      这不是同一个问题。我的问题是,在这种情况下,你是否应该依靠受保护的托尔。不需要抽象。你有关于这个的更多信息的链接吗?这个短语来自Scott Meyers的“更有效的C++”。C++的原因之一是因为操作符=()。但另一部分是语言不可知论的:使用此指导原则会迫使您在需要时识别有用的抽象,而不是之前。谷歌搜索“使非叶类抽象化”至少会得到一个到迈尔斯章节的链接。