<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之旅 廣告
                ### Replace Subclass with Fields(以值域取代子類) 你的各個subclasses 的惟一差別只在「返回常量數據」的函數身上。 修改這些函數,使它們返回superclass 中的某個(新增)值域,然后銷毀subclasses 。 ![](https://box.kancloud.cn/2016-08-15_57b1b5a9dd976.gif) **動機(Motivation)** 建立subclass 的目的,是為了增如新特性,或變化其行為。有一種變化行為(variant behavior )稱為「常量函數」(constant method)[Beck],它們會返回一個硬編碼 (hard-coded)值。這東西有其用途:你可以讓不同的subclasses 中的同一個訪問函數(accessors)返回不同的值。你可以在superclass 中將訪問函數聲明為抽象函數, 并在不同的subclass 中讓它返回不同的值。 盡管常量函數有其用途,但若subclass 中只有常量函數,實在沒有足夠的存在價值。 你可以在中設計一個與「常量函數返回值」相應的值域,從而完全去除這樣的subclass 。如此一來就可以避免因subclassing 而帶來的額外復雜性。 **作法(Mechanics)** - 對所有subclasses 使用Replace Constructor with Factory Method 。 - 如果有任何代碼直接引用subclass,令它改而引用superclass 。 - 針對每個常量函數,在superclass 中聲明一個final 值域。 - 為superclass 聲明一個protected 構造函數,用以初始化這些新增值域。 - 新建或修改subclass 構造函數,使它調用superclass 的新增構造函數。 - 編譯,測試。 - 在superclass 中實現所有常量函數,令它們返回相應值域值,然后將該函數從subclass 中刪掉。 - 每刪除一個常量函數,編譯并測試。 - subclass 中所有的常量函數都被刪除后,使用Inline Method 將subclass 構造函數內聯(inlining)到superclass 的factory method 中。 - 編譯,測試。 - 將subclass 刪掉。 - 編譯,測試。 - 重復「inlining 構造函數、刪除subclass」過程,直到所有subclass 都被刪除。 **范例(Example)** 本例之中,我以Person 表示「人」,并針對每種性別建立一個subclass :以Male subclass「男人」,以Female subclass 表示「女人」: ~~~ abstract class Person { abstract boolean isMale(); abstract char getCode(); ... class Male extends Person { boolean isMale() { return true; } char getCode() { return 'M'; } } class Female extends Person { boolean isMale() { return false; } char getCode() { return 'F'; } } ~~~ 在這里,兩個subclasses 之間惟一的區別就是:它們以不同的方式實現了 Person 所聲明的抽象函數getCode() ,返回不同的硬編碼常量(所以getCode() 是個常量函數[Beck])。我應該將這兩個怠惰subclasses 的去掉。 首先我需要使用Replace Constructor with Factory Method 。在這里,我需要為每個subclasse 建立一個factory method : ~~~ class Person... static Person createMale(){ return new Male(); } static Person createFemale() { return new Female(); } ~~~ 然后我把對象創建過程從以下這樣: ~~~ Person kent = new Male(); ~~~ 改成這樣: ~~~ Person kent = Person.createMale(); ~~~ 將所有「構造函數調用動作」都替換為「factory method 調用動作」后,我就不應該再有任何對subclass 的直接引用了。一次全文搜索就可以幫助我證實這一點。然后,我可以把這兩個subclasses 都聲明為private ,這樣編譯器就可以幫助我,保證至少package 之外不會有任何代碼取用它們。 現在,針對每個常量函數,在superclass 中聲明一個對應的值域: ~~~ class Person... private final boolean _isMale; private final char _code; ~~~ 然后為superclass 加上一個protected 構造函數: ~~~ class Person... protected Person (boolean isMale, char code) { _isMale = isMale; _code = code; } ~~~ 再為subclass 加上新構造函數,令它調用superclass 新增的構造函數: ~~~ class Male... Male() { super (true, 'M'); } class Female... Female() { super (false, 'F'); } ~~~ 完成這一步后,編譯并測試。所有值域都被創建出來并被賦予初值,但到目前為止,我們還沒有使用它們。現在我可以在superclass 中加入訪問這些值域的函數,并刪掉subclasse 中的常量函數,從而讓這些值域粉墨登場: ~~~ class Person... boolean isMale() { return _isMale; } class Male... boolean isMale() { return true; } ~~~ 我可以逐一對每個值域、每個subclass 進行這一步驟的修改;如果我相信自己的運氣,也可以采取一次性全部修改的手段。 所有值域都處理完畢后,所有subclasses 也都空空如也了,于是我可以刪除Person 中那個抽象函數的abstract 修飾符(使它不再成為抽象函數),并以Inline Method 將subclass 構造函數內聯(inlining)到superclass 的factory method 中: ~~~ class Person static Person createMale(){ return new Person(true, 'M'); } ~~~ 編譯、測試后,我就可以刪掉Male class,并對Female class 重復上述過程。
                  <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>

                              哎呀哎呀视频在线观看