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

时间:2012-05-01 16:47:55

标签: c# abstract-class

abstract class的构造函数不应为public,它们应为protected。我的问题是abstract class中的方法。我们可以将它们声明为public,或者出于同样的原因它们也应该protected吗?

3 个答案:

答案 0 :(得分: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 { }

特定成员是public还是protected是否高度依赖于特定的API。对于abstract类型,推理应该与非抽象类型

完全相同

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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