昨天看了一下反模式,居然發(fā)現(xiàn)call super也是其中一種,所謂的call super就是在子類的重載方法中去調(diào)用父類的被重載的方法,說(shuō)的通俗點(diǎn),就是在方法中調(diào)用super.xxx(). 這種寫(xiě)法在Java中真是太普遍了,且不說(shuō)Java的構(gòu)造方法會(huì)自動(dòng)調(diào)用父類的構(gòu)造方法,我們自己也是經(jīng)常在用super.xxx()。為什么它是一種反模式,卻又用的如此普遍呢?
             為什么不提倡用super,Martion Flower是這么解釋的:Whenever you have to remember to do something every time, that's a sign of a bad API. Instead the API should remember the housekeeping call for you. 就是說(shuō)不能讓子類老是記得要調(diào)用super.xxx, 你的API設(shè)計(jì)應(yīng)該幫你調(diào)用。為此,他建議用template method pattern。比如:

          public class EventHandler ...
            public void handle (BankingEvent e) {
              housekeeping(e);
            }
          public class TransferEventHandler extends EventHandler...
            public void handle(BankingEvent e) {
              super.handle(e);
              initiateTransfer(e);
            }

          可以改成:
          public class EventHandler ...
            public void handle (BankingEvent e) {
              housekeeping(e);
              doHandle(e);
            }

            protected void doHandle(BankingEvent e) {
            }
          public class TransferEventHandler extends EventHandler ...
            protected void doHandle(BankingEvent e) {
              initiateTransfer(e);
            }

          但是用模板方法也有它的局限性,它要求改動(dòng)父類代碼,如果你是擴(kuò)展某些API,那那些父類代碼不見(jiàn)得能隨便修改。再加上super.xx()非常直觀明了,我想這也是super call仍然被廣泛使用的原因吧。
          posted on 2009-09-02 16:28 Aaron.Chu 閱讀(242) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2009年9月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          留言簿(5)

          隨筆檔案(57)

          相冊(cè)

          友情鏈接

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 察雅县| 广灵县| 尤溪县| 屏东县| 班戈县| 霍州市| 隆尧县| 黄石市| 镇巴县| 新巴尔虎右旗| 鄯善县| 靖江市| 廉江市| 琼海市| 普宁市| 巴塘县| 南丹县| 平阴县| 临汾市| 宣汉县| 遵义县| 孙吴县| 北辰区| 德保县| 吉林市| 威远县| 双鸭山市| 会宁县| 长沙县| 木里| 潜山县| 阿瓦提县| 漳州市| 柞水县| 武安市| 西青区| 富阳市| 张家界市| 黑水县| 普安县| 虞城县|