ASP.NET学习社区

首页 » ASP.NET学习区 » 经典项目学习 » Discuz nt的模板机制
asp.net - 2008-7-5 7:24:00
Discuz BBS的模板由Discuz.Forum.ForumPageTemplate类负责生成,ForumPageTemplate从Discuz.Common.PageTemplate继承。
PageTemplate是一个抽象类,由一个虚方法、一个抽象方法与一个私有方法组成。
虚方法——作用:继承类可选择是否重写本方法实现,在这里PageTemplate为所有继承者提供默认的“获得模板字符串”方法
继承者如果有特殊需要可以自己override来实现自己的GetTemplate方法。
public virtual string GetTemplate(string forumpath,string skinName, string templateName, int nest,int templateid)
{/**/}
私有方法——作用:继承类不能修改本方法的实现,在这里的作用是“转换标签”,Discuz为了防止继承者去修改标签含义,所以把
本方法设置为私有,如果用户需要定制自己的标记,可以在ReplaceSpecialTemplate中实现。
private string ConvertTags(int nest,string forumpath, string skinName, string inputStr, int templateid)
{/**/}
抽象方法——作用:继承类一定要实现本方法,ForumPageTemplate继承PageTemplate时实现了本方法,
论坛模板在PageTemplcate的基础上增加了“{forumversion}、{forumproductname}”这2个标签
public abstract string ReplaceSpecialTemplate(string forumpath,string skinName,string strTemplate);

在研究这个模板功能时发现2个设计上的问题
1.PageTemplate中的public static Regex[] r = new Regex[21];,Discuz目的是用来替换标记,一共21组标记,
这里可以使用生成器模式来封装起来,但需要处理<%template%>标记就Build一个这样的处理器出来,优势在于——
提高代码质量(可阅读性)、扩展标记起来也方便,以后有新标记直接写好那个处理器,在congif里设置就可以Build
一个处理器出来,不用去写集成类了。

2.ForumPageTemplate有多余的方法。

  public override string GetTemplate(string forumpath,string skinName, string templateName, int nest,int templateid)
  {
  return base.GetTemplate(forumpath,skinName,templateName,nest,templateid);
  }

这里override了虚方法,但在重实现时又调回base方法,不是很多余吗?
今天先写这么多,明天还要上班。。苦呀。。。。。
希望大家看了后回复一下,让我知道今后的研究方向啊。。

from:http://chenjiabin.spaces.live.com/blog/cns!E913AB144DA6B188!265.entry
YSKING - 2008-8-4 14:18:00
嘿嘿,一直想了解的技术,可是感觉很烦杂....
1
查看完整版本: Discuz nt的模板机制