一个abstract class不应该public和他们应该的建设者protected.我的问题是关于这方面的方法abstract class.我们可以将它们声明为public或者它们也应该protected出于同样的原因吗?
构造函数对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类型和非抽象类型,推理应该是完全相同的
抽象类不应该有公共构造函数,因为它们没有意义.抽象类是不完整的,因此允许公共构造器(任何人都可以调用)将无法工作,因为无论如何都无法实例化实例.
关于抽象类的方法是另一个故事.您可以在抽象类中实现,这是所有子类将继承的行为.想想一个Shape类.它的目的是在屏幕上绘制一个形状,因此将Draw方法公开是有意义的,因为您希望调用者能够让您的Shape绘制.该方法本身可以是抽象的,强制子类实现,或者可能提供可能允许或不允许覆盖的实现.这取决于您的类的定义行为应该是什么.