如果基礎的可見性(第4.4.1節)選項不滿足需求,可以使用訪問控制。它適用于類級別和字段級別,知道兩個方向:
> Access control can be used if the basic visibility (4.4.1) options are not suf?cient. It is applicable at class-level and at ?eld-level and knows two directions:
允許訪問:目標是一個授予的訪問指定類或者字段,使用 :allow(target) 元數據(第6.9節)。
禁止訪問:目標是一個禁止訪問的指定類或字段,使用 :access(target) 元數據(第6.9節)。
> **Allowing access**: The target is granted access to the given class or ?eld by using the :allow(target) metadata (6.9).
> **Forcing access**: A target is forced to allow access to the given class or ?eld by using the :access(target) metadata (6.9).
在這個上下文中,一個目標可以是一個點路徑(第3.7節)到:
* 一個類字段
* 一個類或者抽象類型
* 一個包
> In this context, a target can be the dot-path (3.7) to
> * a class ?eld,
> * a class or abstract type, or
> * a package.
目標不能遵從導入,所以必須是完整的合格路徑。
> Target does not respect imports, so the fully quali?ed path has to be used.
如果它是一個類或者抽象類型,訪問修正延伸到所有這個類型的字段。同樣的,如果它是一個包,訪問修正延伸到所有這個包的類型和遞歸到所有這些類型的字段。
> If it is a class or abstract type, access modi?cation extends to all ?elds of that type. Likewise, if it is a package, access modi?cation extends to all types of that package and recursively to all ?elds of these types.
~~~
@:allow(Main)
class MyClass {
static private var foo: Int;
}
class Main {
static public function main() {
MyClass.foo;
}
}
~~~
這里 ,MyClass.foo 可以從main方法中訪問,因為 MyClass 被使用 @:allow(Main) 注釋。這也可以使用 @:allow(Main.main),這兩種方法都可以作為字段foo的注釋替代對MyClass的注釋:
> Here, MyClass.foo can be accessed from the main-method because MyClass is annotated with @:allow(Main). This would also work with @:allow(Main.main) and both versions could alternatively be annotated to the ?eld foo instead of the class MyClass:
~~~
class MyClass {
@:allow(Main.main)
static private var foo: Int;
}
class Main {
static public function main() {
MyClass.foo;
}
}
~~~
如果一個類型不能被修改為允許這類的訪問,訪問方法可以禁止訪問:
> If a type cannot be modi?ed to allow this kind of access, the accessing method may force access:
~~~
class MyClass {
static private var foo: Int;
}
class Main {
@:access(MyClass.foo)
static public function main() {
MyClass.foo;
}
}
~~~
@:access(MyClass.foo) 注釋在main方法中有效的顛覆了foo字段的可見性。
> The @:access(MyClass.foo) annotation effectively subverts the visibility of the foo ?eld within the main-method.
**元數據的選擇**
>[warning] 花絮:元數據的選擇
訪問控制語言特性使用 Haxe元數據語法,而不是額外的語言特定語法。有如下幾個理由:
另外的語法通常使得語言解析更加復雜,也會添加太多關鍵字。
另外的語法需要另外的學習成本,元數據語法是已知的知識。
元數據語法足夠靈活來擴展這個功能。
元數據可以被通過Haxe的宏 訪問/生成/修改。
當然,使用元數據語法主要的缺點是,如果你拼錯元數據的關鍵字(例如@:acesss)或者類/包的名將不會得到錯誤報告。然而,通過這個功能,當你嘗試訪問一個不被允許的私有字段,你會得到一個錯誤,畢竟不可能是一個不被察覺的錯誤。
>[warning] **Trivia**: On the choice of metadata
The access control language feature uses the Haxe metadata syntax instead of additional language-speci?c syntax. There are several reasons for that:
> * Additional syntax often adds complexity to the language parsing, and also adds (too) many keywords.
> * Additional syntax requires additional learning by the language user,whereas metadata syntax is something that is already known.
> * The metadata syntax is ?exible enough to allow extension of this feature.
> * The metadata can be accessed/generated/modi?ed by Haxe macros.
> Of course, the main drawback of using metadata syntax is that you get no error report in case you misspell either the metadata key (@:acesss for instance) or the class/package name. However, with this feature you will get an error when you try to access a private ?eld that you are not allowed to, therefore there is no possibility for silent errors.
**Haxe 3.1.0 以后**
> **Since Haxe 3.1.0**
如果允許訪問一個 接口(第2.3.3節),它延伸到所有實現這個接口的類:
> If access is allowed to an interface(2.3.3),it extends to all classes implementing that interface:
~~~
class MyClass {
@:allow(I)
static private var foo: Int;
}
interface I { }
class Main implements I {
static public function main() {
MyClass.foo;
}
}
~~~
對于訪問授權父類,也是同樣的,這種情況會延伸到所有的子類:
> This is also true for access granted to parent classes, in which case it extends to all child classes.
**破壞性功能**
>[warning] **花絮**:破壞性功能
子類和實現類的訪問擴展只支持Haxe 3.0以后。當編寫這本手冊時發現這部分的訪問控制實現是容易缺失的。
>[warning] **Trivia**: Broken feature
Access extension to child classes and implementing classes was supposed to work in Haxe 3.0 and even documented accordingly. While writing this manual it was found that this part of the access control implementation was simply missing.
- 空白目錄
- 1.Haxe介紹
- 1.1.Haxe是什么
- 1.2.關于本文檔
- 1.2.1.作者及貢獻者
- 1.2.2.License
- 1.3Hello World
- 1.4.Haxe的歷史
- 2.類型
- 2.1.基本類型
- 2.1.1.數值類型
- 2.1.2.溢出
- 2.1.3.數值運算符
- 2.1.4.Bool類型
- 2.1.5.Void類型
- 2.2.為空性
- 2.2.1.可選參數和為空性
- 2.3.類實例
- 2.3.1.類的構造函數
- 2.3.2.繼承
- 2.3.3.接口
- 2.4.枚舉實例
- 2.4.1.Enum構造函數
- 2.4.2.使用枚舉
- 2.5.匿名結構
- 2.5.1.結構值的JSON形式
- 2.5.2. 結構類型的類記法
- 2.5.3.可選字段
- 2.5.4.性能影響
- 2.6.函數類型
- 2.6.1.可選參數
- 2.6.2.默認值
- 2.7.動態類型
- 2.7.1.Dynamic使用類型參數
- 2.7.2.實現Dynamic
- 2.8.抽象類型
- 2.8.1.隱式類型轉換
- 2.8.2.運算符重載
- 2.8.3.數組訪問
- 2.8.4.選擇函數
- 2.8.5.枚舉抽象類型
- 2.8.6.轉發抽象類型字段
- 2.8.7.核心類型抽象
- 2.9.單形
- 3.類型系統
- 3.1.Typedef
- 3.1.1.擴展
- 3.2.類型參數
- 3.2.1.約束
- 3.3.泛型
- 3.3.1.泛型類型參數解釋
- 3.4.變異
- 3.5.統一
- 3.5.1.類/接口 之間
- 3.5.2.結構子類型化
- 3.5.3.單形
- 3.5.4.函數返回
- 3.5.5.通用基本類型
- 3.6.類型推斷
- 3.6.1.由上而下推斷
- 3.6.2.局限
- 3.7.模塊和路徑
- 3.7.1.模塊子類型
- 3.7.2.Import
- 3.7.3.解析順序
- 4.類字段
- 4.1.變量
- 4.2.屬性
- 4.2.1.常見訪問標識符組合
- 4.2.2.對類型系統的影響
- 4.2.3.getter和setter的規則
- 4.3.方法
- 4.3.1.重寫方法
- 4.3.2.變異和訪問修飾符的影響
- 4.4.訪問修飾符
- 4.4.1.可見性
- 4.4.2.Inline
- 4.4.3.Dynamic
- 4.4.4.Override
- 4.4.5.Static
- 5.表達式
- 5.1.塊
- 5.2.常量
- 5.3.二元操作符
- 5.4.一元操作符
- 5.5.數組聲明
- 5.6.對象聲明
- 5.7.字段訪問
- 5.8.數組訪問
- 5.9.函數調用
- 5.10.var
- 5.11.局部函數
- 5.12.new
- 5.13.for
- 5.14.while
- 5.15.do-while
- 5.16.if
- 5.17.switch
- 5.18.try/catch
- 5.19.return
- 5.20.break
- 5.21.continue
- 5.22.throw
- 5.23.類型轉換
- 5.23.1.不安全轉換
- 5.23.2.安全轉換
- 5.24.類型檢查
- 6.語言特性
- 6.1.條件編譯
- 6.2.Externs
- 6.3.靜態擴展
- 6.3.1.標準庫中的靜態擴展
- 6.4.模式匹配
- 6.4.1.介紹
- 6.4.2.枚舉匹配
- 6.4.3.變量捕獲
- 6.4.4.結構匹配
- 6.4.5.數組匹配
- 6.4.6.Or 模式
- 6.4.7.守護
- 6.4.8.多個值的匹配
- 6.4.9.提取器
- 6.4.10.窮盡性檢查
- 6.4.11.無效的模式檢查
- 6.5.字符串插值
- 6.6.數組推導
- 6.7.迭代器
- 6.8.函數綁定
- 6.9.元數據
- 6.10.訪問控制
- 6.11.內聯構造函數
- 7.編譯器用法
- 7.1.編譯器標記
- 8.編譯器功能
- 8.1.內建編譯器元數據
- 8.2.無用代碼消除
- 8.3.編譯器服務
- 8.3.1.概述
- 8.3.2.字段訪問完成
- 8.3.3.調用參數完成
- 8.3.4.類型路徑完成
- 8.3.5.使用完成
- 8.3.6.位置完成
- 8.3.7.頂級完成
- 8.3.8.完成服務
- 8.4.資源
- 8.4.1.嵌入資源
- 8.4.2.檢索文本資源
- 8.4.3.檢索二進制資源
- 8.4.4.實現細節
- 8.5.運行時類型信息
- 8.5.1.RTTI 結構
- 8.6.靜態分析儀
- 9.宏
- 9.1.宏上下文
- 9.2.參數
- 9.2.1.ExprOf
- 9.2.2.常數表達式
- 9.2.3.其它的參數
- 9.3.具體化
- 9.3.1.表達式具體化
- 9.3.2.類型具體化
- 9.3.3.類具體化
- 9.4.工具
- 9.5.類型構建
- 9.5.1.枚舉構建
- 9.5.2.@:autoBuild
- 9.5.3.@:genericBuild
- 9.6.限制
- 9.6.1.Macro-in-Macro
- 9.6.2.靜態擴展
- 9.6.3.構建順序
- 9.6.4.類型參數
- 9.7.初始化宏
- 10.標準庫
- 10.1.字符串
- 10.2.數據結構
- 10.2.1.數組
- 10.2.2.向量
- 10.2.3.列表
- 10.2.4.GenericStack
- 10.2.5.Map
- 10.2.6.Option
- 10.3.正則表達式
- 10.3.1.匹配
- 10.3.2.分組
- 10.3.3.替換
- 10.3.4.分割
- 10.3.5.Map
- 10.3.6.實現細節
- 10.4.Math
- 10.4.1.特殊數值
- 10.4.2.數學錯誤
- 10.4.3.整數數學
- 10.4.4.擴展
- 10.5.Lambda
- 10.6.模板
- 10.7.反射
- 10.8.序列化
- 10.8.1.格式化序列化
- 10.9.Xml
- 10.9.1.開始使用Xml
- 10.9.2.解析Xml
- 10.9.3.編碼Xml
- 10.10.Json
- 10.10.1.解析JSON
- 10.10.2.編碼JSON
- 10.10.3.實現細節
- 10.11.Input/Output
- 10.12.Sys/sys
- 10.13.遠程處理
- 10.13.1.遠程連接
- 10.13.2.實現細節
- 10.14.單元測試
- 11.Haxelib
- 11.1.Haxe編譯器使用庫
- 11.2.haxelib.json
- 11.2.1.版本控制
- 11.2.2.依賴關系
- 11.3.extraParams.hxml
- 11.4.使用Haxelib
- 12.目標平臺細節
- 12.1.JavaScript
- 12.1.1.開始使用Haxe/JavaScript
- 12.1.2.使用外部JavaScript庫
- 12.1.3.注入原生JavaScript
- 12.1.4.JavaScript untyped函數
- 12.1.5.調試JavaScript
- 12.1.6.JavaScript目標元數據
- 12.1.7.為JavaScript暴露Haxe類
- 12.1.8.使用 require函數加載外部類
- 12.2.Flash
- 12.2.1.開始使用Haxe/Flash
- 12.2.2.嵌入資源
- 12.2.3.使用外部Flash庫
- 12.2.4.Flash目標元數據
- 12.3.Neko
- 12.4.PHP
- 12.4.1.開始使用Haxe/PHP
- 12.4.2.PHP untyped函數
- 12.5.C++
- 12.5.1.Using C++定義
- 12.5.2.Using C++ 指針
- 12.6.Java
- 12.7.C#
- 12.8.Python