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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                <!-- Multiple Dispatching --> ## 多路分發 當你要處理多種交互類型時,程序可能會變得相當雜亂。舉例來說,如果一個系統要分析和執行數學表達式。我們可能會聲明 Number.plus(Number),Number.multiple(Number) 等等,其中 Number 是各種數字對象的超類。然而,當你聲明 a.plus(b) 時,你并不知道 a 或 b 的確切類型,那你如何能讓它們正確地交互呢? 你可能從未思考過這個問題的答案.Java 只支持單路分發。也就是說,如果要執行的操作包含了不止一個類型未知的對象時,那么 Java 的動態綁定機制只能處理其中一個的類型。這就無法解決我們上面提到的問題。所以,你必須自己來判定其他的類型,從而實現自己的動態線定行為。 解決上面問題的辦法就是多路分發(在那個例子中,只有兩個分發,一般稱之為兩路分發).多態只能發生在方法調用時,所以,如果你想使用兩路分發,那么就必須有兩個方法調用:第一個方法調用決定第一個未知類型,第二個方法調用決定第二個未知的類型。要利用多路分發,程序員必須為每一個類型提供一個實際的方法調用,如果你要處理兩個不同的類型體系,就需要為每個類型體系執行一個方法調用。一般而言,程序員需要有設定好的某種配置,以便一個方法調用能夠引出更多的方法調用,從而能夠在這個過程中處理多種類型。為了達到這種效果,我們需要與多個方法一同工作:因為每個分發都需要一個方法調用。在下面的例子中(實現了 “石頭、剪刀、布”游戲,也稱為 RoShamBo)對應的方法是 compete() 和 eval(),二者都是同一個類型的成員,它們可以產生三種 Outcome 實例中的一個作為結果: ```java // enums/Outcome.java package enums; public enum Outcome { WIN, LOSE, DRAW } // enums/RoShamBo1.java // Demonstration of multiple dispatching // {java enums.RoShamBo1} package enums; import java.util.*; import static enums.Outcome.*; interface Item { Outcome compete(Item it); Outcome eval(Paper p); Outcome eval(Scissors s); Outcome eval(Rock r); } class Paper implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return DRAW; } @Override public Outcome eval(Scissors s) { return WIN; } @Override public Outcome eval(Rock r) { return LOSE; } @Override public String toString() { return "Paper"; } } class Scissors implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return LOSE; } @Override public Outcome eval(Scissors s) { return DRAW; } @Override public Outcome eval(Rock r) { return WIN; } @Override public String toString() { return "Scissors"; } } class Rock implements Item { @Override public Outcome compete(Item it) { return it.eval(this); } @Override public Outcome eval(Paper p) { return WIN; } @Override public Outcome eval(Scissors s) { return LOSE; } @Override public Outcome eval(Rock r) { return DRAW; } @Override public String toString() { return "Rock"; } } public class RoShamBo1 { static final int SIZE = 20; private static Random rand = new Random(47); public static Item newItem() { switch(rand.nextInt(3)) { default: case 0: return new Scissors(); case 1: return new Paper(); case 2: return new Rock(); } } public static void match(Item a, Item b) { System.out.println( a + " vs. " + b + ": " + a.compete(b)); } public static void main(String[] args) { for(int i = 0; i < SIZE; i++) match(newItem(), newItem()); } } ``` 輸出為: ``` Rock vs. Rock: DRAW Paper vs. Rock: WIN Paper vs. Rock: WIN Paper vs. Rock: WIN Scissors vs. Paper: WIN Scissors vs. Scissors: DRAW Scissors vs. Paper: WIN Rock vs. Paper: LOSE Paper vs. Paper: DRAW Rock vs. Paper: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Rock vs. Scissors: WIN Rock vs. Paper: LOSE Paper vs. Rock: WIN Scissors vs. Paper: WIN Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE ``` Item 是這幾種類型的接口,將會被用作多路分發。RoShamBo1.match() 有兩個 Item 參數,通過調用 Item.compete90) 方法開始兩路分發。要判定 a 的類型,分發機制會在 a 的實際類型的 compete(內部起到分發的作用。compete() 方法通過調用 eval() 來為另一個類型實現第二次分法。 將自身(this)作為參數調用 evalo,能夠調用重載過的 eval() 方法,這能夠保留第一次分發的類型信息。當第二次分發完成時,你就能夠知道兩個 Item 對象的具體類型了。 要配置好多路分發需要很多的工序,不過要記住,它的好處在于方法調用時的優雅的話法,這避免了在一個方法中判定多個對象的類型的丑陋代碼,你只需說,“嘿,你們兩個,我不在乎你們是什么類型,請你們自己交流!”不過,在使用多路分發前,請先明確,這種優雅的代碼對你確實有重要的意義。
                  <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>

                              哎呀哎呀视频在线观看