公共与受保护

本文关键字:受保护 | 更新日期: 2023-09-27 18:20:33

我很困惑为什么类由publicprotected方法/变量组成。为什么只有扩展类才能访问protected方法/变量?其他人能帮助我了解publicprotected之间的区别及其功能吗。

公共与受保护

为什么只有派生类才能访问受保护的成员?

因为这就是"受保护"的定义。受保护成员的可访问性域是类及其派生类。

也许你想问:

为什么我不能总是访问受保护的成员,即使我在派生类中也是如此?

这很复杂。有关详细解释,请参阅我的六部分系列文章"为什么我不能从派生类访问受保护的成员?"

http://blogs.msdn.com/b/ericlippert/archive/tags/protected/

好吧,他们之所以这么做,是因为这只是他们的目的。我想你可能想知道为什么要这样做。简单的答案是因为派生类需要访问它们,而外部类则不需要。

访问修饰符(除了publicprotected,还有privateinternalprotected internal)是一种使代码尽可能易于理解以减少错误的方法。

有些语言没有任何形式的封装。在最极端的情况下,任何代码都可以更改任何数据。一个有纪律的编码器将减少给定类型的数据被操作的位置数量,但可能仍然不清楚所有可能使对象处于不同状态的操作组合。当他们的代码被用作其他人代码的一部分时,情况会变得更糟。

访问修饰符帮助我们处理这个问题。我们默认成员为私人成员。那么,成员唯一可以访问的地方就是类本身。这意味着:

  1. 在如何操纵它们方面,唯一的错误可能是在类内部
  2. 唯一需要担心保持这些成员处于一致状态的代码是在类内部,并且该代码不必担心其他代码可能会破坏它
  3. 通过查看一个类的定义,您可以全面了解这些字段的操作方式,该定义通常在一个文件中,很少在两个以上的文件中

这使我们更容易编写好代码。

当然,所有东西都是私人的课程并没有多大用处。一般来说,我们必须让一些成员公开。通常,我们将字段设为私有字段,将一些有用的方法设为私有方法,然后将一些公共方法和属性使用这些方法和属性。我们仍然可以通过只检查一个类来检查对私有成员的所有可能的操作,尽管我们已经开放了对其他类调用这样做的成员。因此,这些成员为我们提供了一个类内外代码之间的接口,在为其他代码提供有用功能的同时,我们保护类的状态不受错误的影响。

现在应该很清楚,除非我们需要,否则我们不会公开一些东西,但我们确实需要这样做,才能进行有用的工作。

让一个成员受到保护给了我们一个中间立场。我们仍在减少一些可以操纵的地方,但没有那么严重。通常情况下,这样做是为了使派生类可以向在库中定义的通用接口提供自己的机制。

使用它的情况较少,因为通常情况下,我们要么可以将事情保密——这更安全——要么必须公开才能有用。最常见的情况之一是公共成员提供功能,而受保护的成员定义实现该功能的方法。例如,HttpEncoder提供了几种处理HTML字符串编码问题的方法,但有两种受保护的抽象方法是派生类重写的,以提供几种不同方法所共有的功能。外部类不需要访问这些,但派生类需要

一个实际的例子。假设我们有一个实现INotifyPropertyChanging的基类。这个接口意味着它必须跟踪PropertyChangingEventHandler处理程序,并在属性即将更改时引发事件。

我们不希望外部类引发该事件,因为这不关他们的事,让他们这样做只会导致错误。

我们必须让派生类这样做,因为它们可能定义基类不知道的自己的属性。

因此,我们在这个引发事件的基类中定义了一个受保护的方法。外部类不能调用它(降低了被错误调用的风险),但派生类可以(能够完成他们需要做的工作)。

*来自面向对象背景的人甚至可能不认为这些数据片段是"对象"。

假设这是在类Java语言的上下文中。

  • public-可以从任何类访问
  • protected-只能从子类/派生类访问