an 的构造函数abstract
class
should not be public
,它们应该是protected
。我的问题是关于方法的abstract
class
。出于同样的原因,我们可以将它们声明为public
还是应该声明它们?protected
3 回答
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
类型的推理应该与非抽象类型的推理完全相同
抽象类不应该有公共构造函数,因为它们没有意义。抽象类是不完整的,因此允许公共构造函数(任何人都可以调用)将不起作用,因为无论如何您都无法实例化实例。
抽象类的方法是另一回事。您可以在抽象类中实现,这是所有子类都将继承的行为。想想一个 Shape 类。它的目的是在屏幕上绘制一个形状,因此公开一个 Draw 方法是有意义的,因为您希望调用者能够要求您的 Shape 进行绘制。方法本身可以是抽象的,强制子类实现,或者可能提供一个允许或不允许覆盖的实现。这取决于您的类的定义行为应该是什么。
这取决于您的用例。如果您希望派生类的实例可以看到抽象类的方法,您应该将它们设为公开。另一方面,如果您希望这些方法仅对您的派生类可见,则应使它们受到保护。