什麼是所謂的Windows子類化

2021-08-29 04:32:54 字數 1442 閱讀 7160

物件導向大家都清楚。現在oo的主流是基於類的物件導向。子類化故名思義就是定義乙個子類,也就是要訂製乙個類變成乙個新類的意思。

不過windows的子類化不是如此。

首先,我們知道,除了基於類的物件導向以外,還有基於原型(或者叫基於物件)的物件導向。windows是乙個基於物件的os,它的物件系統更傾向於基於原型的oo。windows開發的乙個核心概念是window,也就是常說的視窗,所有的一切別的東西都是圍繞著這個展開的。乙個windows應用程式,其基本的邏輯框架就是:建立乙個視窗,接收系統發給該視窗的訊息進行處理。收到結束訊息的時候,關掉視窗,程式完蛋。

window(注意,不是 windows)相關的乙個概念叫作windowclass,視窗類。視窗類是個啥東西?呵呵,視窗類也是乙個物件,具體的可以認為是window的原型。建立乙個windowclass物件,可以基於該視窗類物件創造多個window,這些window在某一方面都是一致的。舉個例子,有乙個視窗類叫做button,以這個button為原型建立的所有window在某一方面都是一樣的。哪一方面呢?某些樣式,訊息處理例程,選單等等等等。這些都是 windowclass裡面規定的東西。

那位說了,哦,知道了,基於視窗類原型建立出來window,這個過程就是子類化。呵呵,廣義上說,這是對的,就是特化了一些東西。但windows子類化有個特殊的含義,它是特指某種行為的。

windowclass作為乙個物件,擁有物件的一切特徵,其中包括修改其狀態(或屬性)的能力。windowclass有乙個屬性叫做訊息處理器,其實是乙個函式指標,指向乙個處理傳送給它的例項(也就是那些以它為原型的window)的訊息的函式。

所謂的子類化,就是替換這個函式指標成員,用乙個新的訊息處理函式替代原來的訊息處理函式。你或許會覺得奇怪,為什麼這個動作叫做子類化?仔細想想其實也不奇怪,不就是修改了windowclass的行為了麼,這個就是子類化了:)

現在我們可以深入的分析一下這個訊息處理函式的特徵了。

它的職責是處理os分發給它的各種訊息,所以他的典型結構如下:

handle

}對於所有感興趣的訊息,都可以加乙個分支處理。於是很多人開始不滿了,覺得有壞氣味,要重構。重構的方式是把訊息和處理做成乙個map,這樣訊息處理就變成:

handle

return windowssystemdefaultprocess(msg);

}剩下的問題就是怎麼充填這個訊息到處理的映**。

這個充填的方式,mfc採用了巨集(其實大多數c++框架都採用了巨集),但是巨集並不讓人滿意。採用巨集也是歷史原因導致的,那時候c++並沒有stl這麼好用的容器庫。有了map,我們再採用巨集的方式生成乙個對映陣列的方式已經過時了。

有了這一步的重構,我們就可以乙個函式針對乙個訊息進行處理了,cwnd就幫我們幹了這樣一件事。我們要是相對某個特定的訊息進行特定的處理,可以給它乙個特定的處理函式,放在map中替換原來的處理函式即可。還有另一種方式就是override從cwnd繼承下來的訊息處理的虛函式,使用c++的動態分派能力進行特定化。

什麼是虛擬子類,抽象基類的原理

測試樣本取自 流暢的python 先來了解抽象基類 import abc class tombole abc.abc abc.abstractmethod def pick self 隨機刪除元素,然後將其返回 abc.abstractmethod def load self,iterable 從可...

什麼是Windows核心程式設計

什麼是windows核心程式設計?上述文字由 天書夜讀 從組合語言到windows核心程式設計 作者 譚文 提供 你又沒有windows的 你如何搞核心程式設計?除了微軟的人,難道還有人做windows核心嗎?windows核心程式設計有用嗎?其實windows核心程式設計不但有用,而且常用。很多我...

什麼是Windows核心程式設計

什麼是windows核心程式設計?上述文字由 天書夜讀 從組合語言到windows核心程式設計 作者 譚文 提供 你又沒有windows的 你如何搞核心程式設計?除了微軟的人,難道還有人做windows核心嗎?windows核心程式設計有用嗎?其實windows核心程式設計不但有用,而且常用。很多我...