COM與多型的介面(使用Delphi)
//作者: 酷小毅 (酷小毅的程式試鍊場) //2002/05/03 於永和 COM與多型的介面 1.為何談介面的多型 到現在相信大家對於物件導向OOP的觀念都非常清楚了,而這裡我要在一次強調的是關於 COM 對於物件導向的支援以及觀念與傳統的物件導向有些不同,在前面筆者提過傳統 Class 的實作繼承中 SubClass 會 Reference 到 SuperClass 上所必須參考到的資訊,而這些資訊如果修改的話勢必影響的是所有的子類別,這是非常嚴重的,在近代的 OOP 觀念中強調介面與實作分開,介面與實作分開的好處這裡就不在重複,有興趣的請參考筆者的 Delphi COM/DCOM 分散式多層應用文章。我們知道 COM 的介面是可以繼承的,不過要注意的是 COM 並沒有完全的支援繼承,也就是說介面的繼承並不會繼承該介面後端的實作部分,也就是其行為模式,不過父物件 (SuperClass, 這裡也做父系的COM Object) 可以用本身的 Reference 和型別相容的 SubClass 溝通,這也就是我們今天要討論的重點。 圖(一). SuperClass可以和跟他型別相容的SubClass (CApp1, CApp2等)溝通,因為他們都是和CPAutoInterface型別相容的。 2.透過(介面)的實作繼承來達到介面多型 我們今天要探討的是延伸於COM當中的OOP的多型觀念,目前為止相信大家已經了解實作繼承如何影響及重複使用類別當中的方法及實作,這對減少重複性程式碼不僅有高度的Reuse特性也提供了更高的維護性,而多型就是由OOP的實作繼承所演伸出的一個特色,這可以說是物件導向當中最重要的觀念了,我們知道COM強調介面與實作分開,我們可以在一些SubClass繼承某個介面來達到介面的多型 (關於傳統物件導向的多型與COM的多型之差異性有興趣可參考筆者的"Delphi如何實作繼承一個介面"文章,這裡不在重複說明) ,這若應用在 IDispatch 介面所支援的 Automation 技術上即則可達到跨行程呼叫不同應用程式的目的 (這我會在下面第4個章節說明) ,但介面繼承它不像傳統的實作繼承可以直接延伸存取SuperClass的細節部分及存取SuperClass的屬性與方法...