<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                與類不同,抽象類型允許定義隱式轉換。有兩種類型的隱式轉換: **直接轉換:** 允許抽象類型和其它類型之間的直接轉換。這通過從或者往抽象類型添加規則來定義,而且只允許用于和抽象類型的潛在類型統一的類型。 **類字段:** 允許通過調用特別的轉換函數進行轉換。這些函數通過使用 `@:to` 和 `@:from` 元數據定義。這種類型的轉換允許用于所有類型。 如下的代碼示例展示直接轉換的一個例子: ~~~ abstract MyAbstract(Int) from Int to Int { inline function new(i:Int) { this = i; } } class Main { static public function main() { var a:MyAbstract = 12; var b:Int = a; } } ~~~ 我們聲明 `MyAbstract` 可以是從或者到 Int 類型,意思是它可以被用 Int 分配,并且可以分配到 Int 類型。這在第9和10行展示,第一個分配 Int `12` 到 `MyAbstract` 類型的變量 `a`(通過使用 `from Int` 聲明 ),然后這個抽象類型分配回 Int 類型變量 `b`(通過使用 `to Int` 聲明)。 另一種的類字段轉換有相同的語義,但是定義完全不同: ~~~ abstract MyAbstract(Int) { inline function new(i:Int) { this = i; } @:from static public function fromString(s:String) { return new MyAbstract(Std.parseInt(s)); } @:to public function toArray() { return [this]; } } class Main { static public function main() { var a:MyAbstract = "3"; var b:Array<Int> = a; trace(b); // [3] } } ~~~ 通過添加 `@:from` 到一個靜態函數,這個函數獲得資格作為從它的參數類型到抽象類型的隱式轉換函數。這些函數必須返回一個抽象類型的值。它們還必須被聲明為靜態的 : 類似的,添加 `@:to` 到一個函數,它獲取資格作為從抽象類型到它的返回類型的隱式轉換函數。這些函數通常是成員函數,但是它們可以被聲明為靜態 ,然后作為一個 [選擇函數(第2.8.4節)](http://#)。 在例子中,方法 `fromString` 允許分配值 “`3`” 到 `MyAbstract` 類型的變量 `a`,而方法 `toArray` 允許分配抽象類型到 `Array<Int>` 類型的變量 `b`。 當使用這種類型的轉換,轉換函數的調用被插入在需要的地方。當查看 JavaScript 輸出的時候會很明顯: ~~~ var a = _ImplicitCastField.MyAbstract_Impl_.fromString("3"); var b = _ImplicitCastField.MyAbstract_Impl_.toArray(a); ~~~ 這可以被進一步優化,通過 [內聯(第4.4.2節)](http://#) 兩種轉換函數,使得輸出如下: ~~~ var a = Std.parseInt("3"); var b = [a]; ~~~ 當分配一個類型 A 到一個類型 B,并且至少它們中的一個為抽象類型時,選擇的規則很簡單: * 1.如果 A 不是一個抽象類型,去到 3 * 2.如果 A 定義了一個允許到 B 的 `to` 轉換,去到6 * 3.如果 B 不是一個抽象類型,去到 5 * 4.如果 B 定義一個允許到 A 的 `from` 轉換,去到6 * 5.停止,統一失敗 * 6.停止,統一成功 ![](https://box.kancloud.cn/2016-07-29_579b1c58128b5.png) 經過設計,隱式轉換不被傳遞,就像下面的例子展示的: ~~~ abstract A(Int) { public function new() this = 0; @:to public function toB() return new B(); } abstract B(Int) { public function new() this = 0; @:to public function toC() return new C(); } abstract C(Int) { public function new() this = 0; } class Main { static public function main() { var a = new A(); var b:B = a; // valid, uses A.toB var c:C = b; // valid, uses B.toC var c:C = a; // error, A should be C } } ~~~ 雖然從 A 到 B 的轉換和從 B 到 C 的轉換分別是允許的,而一個傳遞的從 A 到 C 的轉換則不允許。這是為了避免不明確的轉換路徑,并保持一個簡單的選擇規則。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看