抽象类可以包含公共方法吗?

Boh*_*ohn 1 c# abstract-class

一个abstract class不应该public和他们应该的建设者protected.我的问题是关于这方面的方法abstract class.我们可以将它们声明为public或者它们也应该protected出于同样的原因吗?

Jar*_*Par 8

构造函数对abstract类型存在的理由protected是,除了派生类型之外,根本没有其他实体可以调用构造函数.public在这种情况下使构造函数毫无意义,因为它不能在类型层次结构之外调用.因此建议使用,protected因为它是最合适的访问修饰符.

对于该类型的其他成员,同样的逻辑也不适用.如果访问修饰符允许,可以从类型层次结构外部自由调用它们.

public abstract class Dog {

  // Public is appropriate here as any consumer of Dog could access
  // Breed on an instantiated object
  public abstract string Breed { get; }

  // Public would be meaningless here. It's not legal to say 
  // 'new Dog' because 'Dog' is abstract. You can only say 
  // 'new Poodle' or 'new Bulldog'.  Only derived types like
  // Poodle or Bulldog could invoke the Dog constructor hence it's
  // protected
  protected Dog() { }
}

public class Poodle : Dog { } 
public class Bulldog : Dog { }
Run Code Online (Sandbox Code Playgroud)

特定成员是否应该public或者protected高度依赖于特定API.对于abstract类型和非抽象类型,推理应该是完全相同的


And*_*ndy 6

抽象类不应该有公共构造函数,因为它们没有意义.抽象类是不完整的,因此允许公共构造器(任何人都可以调用)将无法工作,因为无论如何都无法实例化实例.

关于抽象类的方法是另一个故事.您可以在抽象类中实现,这是所有子类将继承的行为.想想一个Shape类.它的目的是在屏幕上绘制一个形状,因此将Draw方法公开是有意义的,因为您希望调用者能够让您的Shape绘制.该方法本身可以是抽象的,强制子类实现,或者可能提供可能允许或不允许覆盖的实现.这取决于您的类的定义行为应该是什么.

  • 一个抽象类_can_有一个公共ctor.它们不是很有用. (2认同)

Rob*_*vey 5

这取决于您的使用案例.如果希望抽象类的方法对派生类的实例可见,则应将它们公之于众.另一方面,如果您希望方法仅对派生类可见,则应该使它们受到保护.