3

an 的构造函数abstract classshould not be public,它们应该是protected。我的问题是关于方法的abstract class。出于同样的原因,我们可以将它们声明为public还是应该声明它们?protected

4

3 回答 3

10

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 { }

特定成员是否应该publicprotected高度依赖于特定 API。abstract类型的推理应该与非抽象类型的推理完全相同

于 2012-05-01T16:53:34.840 回答
6

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

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

于 2012-05-01T16:54:28.707 回答
5

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

于 2012-05-01T16:54:07.133 回答