UIWebBrowserView并不算复杂,主要负责这些工作:
form的自动填充
fixed元素的位置调整
键盘弹出时的视图滚动处理,防止遮挡
各种信息的中转,见_messages变量
提供接口让UIWebView获取信息
为显示PDF时添加页号标签
下面想探讨一下UIWebBrowserView->UIWebDocumentView->UIWebTiledView这样的设计。
从已掌握的信息看,他们的成员变量都是使用private继承,即子类无法直接访问父类的成员变量。他们之间的关系是子类操控父类,基类的职责不会牵涉和考虑到子类,分工非常明确。由于UIWebDocumentView直接管理WebView,它的职责是有部分属于Controller的行为,例如手势事件。但是UIWebBrowserView的JavaScript手势却完全不干涉UIWebDocumentView的手势,通过别的途径来获取更高优先级的处理权。
总之,通过继承来拆分一个大类,必须做到这样才是可行的,值得借鉴。要拆分大类通常会用组合,但这里就是不用组合的优秀例子。当然,这也要求继承链里不能有分支,即基类不会有多个子类。