<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國際加速解決方案。 廣告
                ### Replace Delegation with Inheritance(以繼承取代委托) 你在兩個classes 之間使用委托關系(delegation),并經常為整個接口編寫許多極簡單的請托函數(delegating methods)。 讓「請托(delegating)class」繼承「受托 class (delegate)」。 ![](https://box.kancloud.cn/2016-08-15_57b1b5e7d248f.gif) **動機(Motivation)** 本重構與 Replace Delegation with Inheritance 恰恰相反。如果你發現自己需要使用「受托 class」中的所有函數,并且費了很大力氣編寫所有極簡的請托函數(delegating methods),本重構可以幫助你輕松回頭使用「繼承」。 兩條告誡需牢記于心。首先,如果你并沒有使用「受托class 」的所有函數(而非只是部分函數),那么就不應該使用Replace Delegation with Inheritance,因為subclass 應該總是遵循(奉行)superclass 的接口。如果過多的請托函數讓你煩心,你有別的選擇:你可以通過 Remove Middle Man 讓客戶端自己調用受托函數,也可以使用Extract Superclass 將兩個classes 接口相同的部分提煉到superclass 中, 然后讓兩個classes 都繼承這個新的superclass ;你還可以以類似手法使用Extract Interface。 另一種需要當心的情況是:受托對象被不止一個其他對象共享,而且受托對象是可變的(mutable)。在這種情況下,你就不能將「委托關系」替換為「繼承關系」,因為這樣就無法再共享數據了。數據共享是必須由「委托關系」承擔的一種責任,你無法把它轉給「繼承關系」。如果受托對象是不可變的(immutable),數據共享就不 成問題,因為你大可放心地拷貝對象,誰都不會知道。 **作法(Mechanics)** - 讓「請托端」成為「受托端」的一個subclass 。 - 編譯。 - 此時,某些函數可能會發生沖突:它們可能有相同的名稱,但在返回型別(return type)、異常指定(exceptions)或可視性(visibility)方面有所差異。你可以使用Rename Method 解決此類問題。 - 將「受托值域」(delegated field)設為「該值域所處之對象自身」。 - 去掉簡單的請托函數(delegating methods)。 - 編譯并測試。 - 將所有其他「涉及委托關系」的動作,改為「調用對象自身(繼承而來的函 數)」。 - 移除「受托值域」(delegated field)。 **范例:(Example)** 下面是一個簡單的Employee,將一些函數委托給另一個同樣簡單的Person : ~~~ class Employee { Person _person = new Person(); public String getName() { return _person.getName(); } public void setName(String arg) { _person.setName(arg); } public String toString () { return "Emp: " + _person.getLastName(); } } class Person { String _name; public String getName() { return _name; } public void setName(String arg) { _name = arg; } public String getLastName() { return _name.substring(_name.lastIndexOf(' ')+1); } } ~~~ 第一步,只需聲明兩者之間的繼承關系: ~~~ class Employee extends Person ~~~ 此時,如果有任何函數發生沖突,編譯器會提醒我。如果某幾個函數的名稱相同、但返回型別不同,或拋出不同的異常,它們之間就會出現沖突。所有此類問題都可以通過Rename Method 加以解決。為求簡化,我沒有在范例中列出這些麻煩情況。 下一步要將「受托值域」(delegated field)設值為「該值域所處之對象自身」。同時,我必須先刪掉所有簡單的請托函數(例如getName() 和setName())。如果留下這種函數,就會因為無限遞歸而引起系統的call stack 滿溢(overflow)。在此范例中,我應該把Employee 的getName() 和setName() 拿掉。 一旦Employee 可以正常工作了,我就修改其中「使用了請托函數(譯注:或受托值域)」的函數,讓它們直接調用「從superclass 繼承而來的函數」: ~~~ public String toString () { return "Emp: " + getLastName(); } ~~~ 擺脫所有涉及委托關系的函數后,我也就可以擺脫_person 這個(受托)值域了。
                  <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>

                              哎呀哎呀视频在线观看