PROTECTED:(访问控制)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgVisProtected
- 最后更新: 2022-04-23
在 Type 或 Class 中指定受保护成员访问控制
语法
vb
Type typename
Protected:
member declarations
End Type参数
typename
Type 或 Class 的名称
member declarations
字段、函数或枚举的声明
描述
Protected: 表示其后的 member declarations(成员声明)具有受保护访问权限。
受保护成员只能从其所属 Type 或 Class 的成员过程内部,以及从该 Type 或 Class 派生的类中访问。从此类成员过程内部来看,就好像受保护成员实际上是公共的,无论对哪个对象应用访问运算符都是如此。
Protected: 之后的 member declarations 保持受保护,直到给出不同的访问控制修饰符,如 Private: 或 Public:。
Type 声明中的成员默认为 Public:(如果未给出成员访问控制修饰符)。
示例
start GeSHi
vb
Type animal
Dim As String animalName
Protected:
Dim As Integer serialNumber
End Type
Type dog Extends animal
Dim As String masterName
Declare Sub setSerialNumber ( ByVal number As Integer )
End Type
Sub dog.setSerialNumber ( ByVal number As Integer )
'' 这是正确的。我们在派生类型的成员函数内部
This.serialNumber = number
End Sub
Dim As dog d
'' 这是正确的,animalName 是公共的
d.animalName = "Buddy"
'' 这将产生编译错误:
'' - serialNumber 是受保护的,我们试图在其类型和派生类型之外访问它
'' d.serialNumber = 123456789end GeSHi
start GeSHi
vb
' 使用受保护访问控制的示例,管理员权限为用户权限提供令牌:
' - 'admin_right' 类型继承 'user_right' 类型。
' - 直接创建 'user_right' 对象是禁止的。
' ('默认 user_right.constructor' 访问和 '复制 user_right.constructor' 访问均为 'Protected')
' - 'user_right' 类型只有获取令牌的访问权限。
' ('user_right.token' get 属性访问为 'Public','user_right.token' set 属性访问为 'Protected')
' - 'admin_right' 类型有设置和获取令牌的访问权限。
' ('admin_right.token' get 属性访问和 'admin_right.token' set 属性访问均为 'Public')
'
' 创建一个 'admin_right' 对象,然后定义一个类型为 'user_right' 的引用指向该对象。
' (直接创建 'user_right' 对象是禁止的)
Type user_right
Public:
Declare Property token () As String '' 'Public' 授权 user_right 令牌获取
Protected:
Declare Constructor () '' 'Protected' 禁止 user_right 对象默认构造
Declare Constructor (ByRef u As user_right) '' 'Protected' 禁止 user_right 对象复制构造
Declare Property token (ByRef s As String) '' 'Protected' 禁止 user_right 令牌设置
Private:
Dim As String user_right_token '' 'Private' 禁止从 user_right 外部访问
End Type
Constructor user_right () '' 默认构造函数
End Constructor
Constructor user_right (ByRef u As user_right) '' 受保护复制构造函数
This.user_right_token = u.user_right_token
End Constructor
Property user_right.token () As String '' 公共属性 user_right 令牌获取
Return This.user_right_token
End Property
Property user_right.token (ByRef s As String) '' 受保护属性 user_right 令牌设置
This.user_right_token = s
End Property
Type admin_right Extends user_right
Public:
Declare Property token () As String '' 'Public' 授权 admin_right 令牌获取
Declare Property token (ByRef s As String) '' 'Public' 授权 admin_right 令牌设置
End Type
Property admin_right.token () As String '' 公共属性 admin_right 令牌获取
Return Base.token '' 'Base.' 访问被此属性名遮蔽的基类型属性
End Property
Property admin_right.token (ByRef s As String) '' 公共属性 admin_right 令牌设置
Base.token = s '' 'Base.' 访问被此属性名遮蔽的基类型属性
End Property
Dim As admin_right ar '' 创建 admin_right 类型对象 'ar'
ar.token = "fxm123456789" '' admin_right 为 user_right 设置令牌
Print "'" & ar.token & "'" '' admin_right 获取 user_right 令牌
Print
Dim ByRef As user_right ur = ar '' 创建类型为 'user_right' 的引用 'ur' 指向 admin_right 类型的 'ar' 实例
Print "'" & ur.token & "'" '' user_right 获取其令牌
'ur.token = "fxm0" '' 错误:非法成员访问,USER_RIGHT.TOKEN.property.set(user_right 无法设置其令牌)
'Dim As user_right ur1 '' 错误:默认构造函数没有公共访问权限
'Dim As user_right ur2 = ar '' 错误:构造函数没有公共访问权限
Sleepend GeSHi
方言差异
- 仅在 -lang fb 方言中可用。
与 QB 的区别
- FreeBASIC 新增
参见
ClassPrivate:(访问控制)Public:(访问控制)Type
返回 目录