UIWebBrowserView并不算複雜,主要負責這些工作:
form的自動填充
fixed元素的位置調整
鍵盤彈出時的視圖滾動處理,防止遮擋
各種資訊的中轉,見_messages變量
提供接口讓UIWebView擷取資訊
為顯示PDF時添加頁号标簽
下面想探讨一下UIWebBrowserView->UIWebDocumentView->UIWebTiledView這樣的設計。
從已掌握的資訊看,他們的成員變量都是使用private繼承,即子類無法直接通路父類的成員變量。他們之間的關系是子類操控父類,基類的職責不會牽涉和考慮到子類,分工非常明确。由于UIWebDocumentView直接管理WebView,它的職責是有部分屬于Controller的行為,例如手勢事件。但是UIWebBrowserView的JavaScript手勢卻完全不幹涉UIWebDocumentView的手勢,通過别的途徑來擷取更高優先級的處理權。
總之,通過繼承來拆分一個大類,必須做到這樣才是可行的,值得借鑒。要拆分大類通常會用組合,但這裡就是不用組合的優秀例子。當然,這也要求繼承鍊裡不能有分支,即基類不會有多個子類。