26
2019.2

控制器的继承

作者: POPASP
VBS的类本身不具有继承的功能,但是在后台的登陆中,类的继承的重要性是不言而喻的。POPASP在VBS中模拟实现了类的继承,虽不具有真正的继承功能,但是完美解决了后台登陆验证等难题。 我们现在定义两个控制器common.asp与nav.asp common.asp控制器代码如下 ```brush:vb <% Class Common sub initialize var_export "Common.initialize
" end sub End Class %> ``` nav.asp控制器代码如下 ```brush:vb <% Class Nav 'Extends Common sub initialize var_export "Nav.initialize
" end sub sub index var_export "Nav.index
" end sub End Class %> ``` 访问 ```brush:html http://serverName/index.asp?c=nav&a=index ``` 得到的结果如下: ```brush:xml Common.initialize Nav.initialize Nav.index ``` 注意观察控制台的“流程”,它给执行过程作了很好的解释 ```brush:xml 准备执行 NavAction.index 发现了继承类Common,准备执行继承类 准备执行 CommonAction.initialize 开始执行 CommonAction.initialize 执行结束 CommonAction.initialize 开始执行 NavAction.initialize 执行结束 NavAction.initialize 开始执行 NavAction.index 执行结束 NavAction.index ``` 在示例中,我们看到Nav控制器在执行的时候首先执行了Common控制器,这是由于在定义控制器的类的代码后面,添加一条注释 > 'Extends Common 这一行注释就完成了控制器的继承,是不是很酷? 控制器的继承体现在方法的继承,在上面的示例中,父类Common的initialize也被执行到了。如果子类中没有的方法在父类中有,那么父类中的方法是会被执行到的。在上面的示例中,我们更进一步。 其他代码不变,我们只修改Common控制器中的代码 ```brush:xml <% Class Common sub initialize var_export "Common.initialize
" end sub sub remove var_export that.get("id") var_export "
" end sub End Class %> ``` 访问 ```brush:html http://serverName/index.asp?c=Nav&a=remove&id=3 ``` 结果如下: ```brush:xml Common.initialize Nav.initialize 3 Nav.index ``` 再看控制器的流程 ```brush:xml 准备执行 NavAction.remove 发现了继承类Common,准备执行继承类 准备执行 CommonAction.initialize 开始执行 CommonAction.initialize 执行结束 CommonAction.initialize 开始执行 NavAction.initialize 执行结束 NavAction.initialize 没有方法 NavAction.remove 尝试执行父类的方法 Common.remove 准备执行 CommonAction.remove 开始执行 CommonAction.remove 执行结束 CommonAction.remove 准备执行 NavAction.index 开始执行 NavAction.index 执行结束 NavAction.index ``` 从上面的流程中可以看到,父类Common的remove方法确实被执行到了。当然在本例中,其实我们并不想要再执行Nav控制器中的方法index,而我们所做的remove删除操作后,页面是要进行跳转的。在“页面跳转”一节中,我们会具体讲到控制器的跳转,现在我们可以通过response.end来屏蔽后面所有的操作。如下所示 ```brush:vb sub remove var_export that.get("id") var_export "
" response.end end sub ``` 控制器的继承并不仅限于两层,事实上程序内部规定最多可以继承10层,这足够满足我们的项目需求。 当控制器的继承遇见了前置操作与后置操作,结果又会是什么样子呢?事实上它正如我们预料的流程执行。看如下示例 控制器Common的代码 ```brush:vb <% Class Common sub initialize var_export "Common.initialize
" end sub sub add var_export "Common.add
" end sub sub after__add var_export "Common.after__add
" end sub End Class %> ``` 控制器Nav的代码 ```brush:vb <% Class Nav 'Extends Common sub before__add var_export "Nav.before__add
" end sub sub after__add var_export "Nav.after__add
" end sub End Class %> ``` 访问 ```brush:html http://serverName/index.asp?c=Nav&a=add ``` 结果如下: ```brush:xml Common.initialize Nav.before__add Common.add Common.after__add ``` 控制台的流程如下: ```brush:xml 准备执行 NavAction.add 发现了继承类Common,准备执行继承类 准备执行 CommonAction.initialize 开始执行 CommonAction.initialize 执行结束 CommonAction.initialize 发现了前置操作 NavAction.before__add 开始执行 NavAction.before__add 执行结束 NavAction.before__add 没有方法 NavAction.add 尝试执行父类的方法 Common.add 准备执行 CommonAction.add 开始执行 CommonAction.add 执行结束 CommonAction.add 发现了后置操作 CommonAction.after__add 开始执行 CommonAction.after__add 执行结束 CommonAction.after__add ``` 从上面我们发现子类Nav的前置操作`before__add`如愿以偿被执行到了,它执行完后,程序会像爬楼梯一样,会执行父类Common的add方法,而且还会执行父类的后置操作`after__add`,而且要注意的是,此时即便父类没有`after__add`这个后置操作,程序也不会返回去再执行Nav控制器的`after__add`后置操作。如何让其返回执行后置操作,请详阅“父子类的通信”一节。 掌握了控制器的继承,我们可以在Common的方法initialize中加入控制权限,来实现登陆的验证。 例如: ```brush:vb <% Class Common Sub initialize if isEmpty( session("admin") ) Then call that.redirect( "login.asp" ) end If End Sub End Class %> ```