昨天看了一下反模式,居然發(fā)現(xiàn)call super也是其中一種,所謂的call super就是在子類的重載方法中去調(diào)用父類的被重載的方法,說的通俗點,就是在方法中調(diào)用super.xxx(). 這種寫法在Java中真是太普遍了,且不說Java的構(gòu)造方法會自動調(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. 就是說不能讓子類老是記得要調(diào)用super.xxx, 你的API設計應該幫你調(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);
            }

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

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


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

          留言簿(5)

          隨筆檔案(57)

          相冊

          友情鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 郑州市| 紫阳县| 乐都县| 札达县| 德阳市| 七台河市| 张掖市| 工布江达县| 咸宁市| 惠来县| 报价| 繁峙县| 东宁县| 于都县| 昌黎县| 桦南县| 台东市| 内江市| 桐柏县| 庆安县| 麦盖提县| 囊谦县| 韶关市| 河曲县| 靖西县| 鹿泉市| 渝中区| 建德市| 德钦县| 开鲁县| 永康市| 阳春市| 镇沅| 石狮市| 青川县| 石阡县| 陇川县| 绥德县| 华坪县| 富顺县| 张家界市|