<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                一些類或接口是特定操作其他類的實例。這些操作可以被在不分享任何通用父類或接口類的實例執行。考慮如下例子: ~~~ class BinaryNode { private var content : String; public var parent : BinaryNode; public var leftChild : BinaryNode; public var rightChild : BinaryNode; public function new (content : String) { this.content = content; } public function getContent() : String { return content; } } ~~~ BinaryNode 類是一個非常簡單的容器來層級結構存儲信息。這個例子,每個節點的內容是String類型,但是它聽起來很顯然,完全相同的 node 類可以簡單的被改變來存儲任何類型的值。要這樣做使用至今獲得的只是,問題可以以兩種方式之一解決:聲明一個新的 node 類對每個存儲到它的類型或者使用一個 Dynamic類型的內容。第一種方案非常重復(記住DRY原則,don't repeat yourself),而且當實現只有一點改變的時候非常痛苦。第二個方案是脆弱的因為它需要不斷地投射到一個合適的類型每次 getContent() 被調用時,并且總是一個好的實踐來避免不安全的投射如果不是絕對必要。 需要的是一個通用的方法(generics是用在C#和JAVA等語言中同樣上下文的術語);這完全就是所用的類型參數的目的。一個類型參數是一個通用的具體類型的占位符。 重新編碼,按照如下: ~~~ class BinaryNode < T > { private var content : T; public var parent : BinaryNode < T > ; public var leftChild : BinaryNode < T > ; public var rightChild : BinaryNode < T > ; public function new (content : T) { this.content = content; } public function getContent() : T { return content; } } ~~~ 在類的實例化中一個類型必須提供 T 按照如下方式: ~~~ var ns : BinaryNode < String > = new BinaryNode < String > (“I’m a node”); ~~~ 另一個例子是: ~~~ var ni : BinaryNode < Int > = new BinaryNode < Int > (7); ~~~ 現在 ns.getContent() 會返回一個String類型的值,而ni.getContent() 會返回一個Int 類型的值。 你可以縮短類型聲明,通過類型推斷來減少代碼: ~~~ var ns = new BinaryNode(“I’m a node”); ~~~ String類型參數可以被從構造器忽略,因為編譯工具可以推斷出正確的類型,從文本參數。變量不需要任何類型聲明,因為完整類型可以通過構造器推斷出來。 對象創建時的類型聲明總是保留不變直到對象唄垃圾回收,在運行時不可改變。 給類參數名字 T 只是一個慣例。多于一個的類參數可以通過一個逗號分隔來指定,在括號中間。 類型參數也可以在函數層被指定;這個情況generic參數有一個目的只有在聲明函數的上下文,而且和類的類型參數聲明相同的方式,但是位于函數名后面。 ~~~ public static function indexOf < T > (v : T, a : Array < T > ) { for(i in 0...a.length) if(v == a[i]) return i; return -1; } ~~~ 這個函數有一個值類型T的參數,和一個相同類型數組,返回array中值得位置,如果沒有找到返回-1 。這個函數被以傳統方式使用: ~~~ var l = [1,2,4,8,16]; // l is of type Array < Int > trace(indexOf(8, l)); ~~~ 這會輸出3或者帶有另一個類型的數組: ~~~ var ls = [“A”,”B”,”C”,”D”]; // ls is of type Array< String > trace(indexOf(“C”, ls)); ~~~ # 類型參數限制 * * * * * 通用的是有用的,但是太通用可能造成混淆。鑒于此,Haxe提供一個方式來限制類型參數只能使用一些類型。限制參數使用如下的語法: ~~~ class Name<T : Type, T : (Type, Type)> ~~~ 圓括號的使用是強制消除歧義,當多于1個類參數使用的時候。多個約束通常是一個類和一個或者多個接口的結合;類型 T 必須滿足所有列出的約束。類型約束不局限于類,還可以應用到接口中,enum,和 typedef 。 當使用類型約束,可以實現特定的對象容器,如下: ~~~ class Item { public function new() {} } class Movie extends Item { } class Butterly extends Item { } class Collection < T : Item > { public function new() {} public function add(item : T) { // implementation goes here } } ~~~ 在你的應用中你可以使用 Collection 類型來創建一個容器對于電影或者蝴蝶。 ~~~ var movies = new Collection < Movie > (); // the constraint is on the class Movie movies.add(new Movie()); // accepted value movies.add(new Butterly()); // compiler does not permit this ~~~ 約束也可以使用標準類型。一個約束Float類型可以限制數值的訪問;在實例化中可以標記狀態如果值必須是整數或實數。 ~~~ class Point < T : Float > { public var x : T; public var y : T; public function new(x : T, y : T) { this.x = x; this.y = y; } } ~~~ 這個類可以像如下使用: ~~~ var pInt = new Point < Int > (10, 20); // pInt.x = 0.1; // does not compile var pFloat = new Point < Float > (0.1, 0.2); ~~~
                  <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>

                              哎呀哎呀视频在线观看