成员访问权限与封装
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgMemberAccessRights
- 最后更新: 2020-08-08
将成员访问限制到代码的特定部分。
成员访问权限
概述
Type 的所有成员(包括成员数据、过程、常量等)属于三种不同分类之一,每种分类都有自己的规则,规定它们可以在代码的哪些位置被访问或引用。
这些规则称为访问权限。
有公共、受保护和私有成员,它们分别在 Type 定义中紧跟 Public、Protected 或 Private 标签后声明。
默认情况下,即没有访问分类标签时,Type 的成员是公共的。
公共成员
公共成员可以从任何地方引用;例如,可以从成员过程、模块级代码或普通过程中访问它们。
受保护成员
受保护成员只能从声明它们的 Type 的成员过程,或派生 Type 的成员过程中访问。外部代码无法访问它们。
私有成员
私有成员只能从声明它们的 Type 的成员过程中访问。外部代码或派生 Type 的成员过程都无法访问它们。
构造函数和析构函数
构造函数和析构函数遵循与其他成员相同的规则:
当为公共时,对象可以在代码中的任何地方实例化和销毁。
当为受保护时,对象只能从其
Type或派生Type的成员过程中实例化和销毁。私有构造函数和析构函数将对象实例化限制于其
Type的成员过程。
封装
概述
封装是将对象实现细节隐藏起来不让对象使用者看到的过程。
使用者通过公共接口访问对象。
这样,使用者可以使用对象而不必了解它是如何实现的。
封装通过访问说明符(Private、Protected 或 Public)实现。
通常,Type 的所有成员变量都设为私有(隐藏实现细节),而大多数成员过程设为公共(为使用者提供接口)。
虽然要求 Type 的使用者使用公共接口看起来比直接提供对成员变量的公共访问更加繁琐,但这样做实际上提供了许多有益的好处,有助于促进 Type 的可重用性和可维护性。
封装 Type 的好处
保护:
对全局变量的访问是危险的,因为你无法严格控制谁有权访问全局变量,或他们如何使用它。
Type 的公共成员也存在同样的问题,但规模较小。
封装允许 Type 的程序员:
通过以下方式主动控制对其内部(指针、变量等)的访问:无 / 只读 / 只写 / 读写。
通过拒绝某些破坏性的用户操作(如指针覆写、释放内存等)来保护操作安全。
抽象:
使用完全封装的 Type,你只需要知道哪些成员过程是公开可用的,它们接受什么参数,以及返回什么值。Type 内部是如何实现的并不重要。
例如,一个保存名称列表的 Type 可能使用不同的数据结构实现。
为了使用 Type,你不需要知道(或关心)使用了哪种。
这大大降低了程序的复杂性,也减少了错误。
隐藏内部实现细节:
内部成员声明为 Private/Protected,用户接口使用方法和属性作为 getter/setter,
另外定义构造函数、复制构造函数、析构函数、赋值运算符等,
提供了一定程度的抽象。
比任何其他原因,这是封装的关键优势。
示例
- 在下面的示例中,数据成员
hour、minute和second是私有的,而成员过程set_Time()、get_Time()和increment_Time()是公共的: - 有关使用 OOP 的更高级示例(包含封装 + 抽象 + 继承 + 多态),请参见'继承多态'中的示例(Graph type collection)。
另请参阅
返回 目录