有三个类:base,a,b
base类就是用户的基本信息,b类就是处理页面的公用方法,头、尾、提示信息什么的,a类就是每个页面自己的类,比如用户登录,新闻列表什么的。
a类和b类都继承base类,现在我想在a类里引用b类,能不能不实例化b类?因为每个页面都要调用b类的header()、footer()方法来生成html的头和尾,都要new一下感觉挺麻烦的。
以下是示例:
b.cs
public class pagectrl : pagebase
{
private string _pageTitle = ""; //不能使用静态字段
public string PageTitle
{
get { return _pageTitle; }
set { _pageTitle = value; }
}
public void Header() //需要引用_pageTitle变量,不能使用静态方法
{
HttpContext.Current.Response.Write("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /><title>" + (_pageTitle.Length > 0 ? _pageTitle + " - " : "") + "我的网站</title><link rel=\"stylesheet\" href=\"images/common/common.css\" /<script type=\"text/javascript\" src=\"js/common.js\"></script></head><body>");
}
public void Footer()
{
HttpContext.Current.Response.Write("</body></html>");
}
}
a.cs:
public partial class login : pagebase
{
protected internal pagectrl pc = new pagectrl();//每页都要实例化一次,太麻烦啦
protected void Page_Load(object sender, EventArgs e)
{
string action = fun.SafeRequest(3, "action", 0);
if (action == "login")
{
Login();
}
else if (action == "logout")
{
ClearCookies();
}
pc.PageTitle = "登陆";
pc.Header();
pc.Footer();
}
}
如果网站功能比较复杂,例如再加个Cache缓存类、定时清理无效数据的Task类等等,那岂是不是每个页面都要new一下这些类,那该多麻烦啊。
当然不能啊
可以这样:
修改继承层次,将调用较多公用的方法放在父类
或者
使用current字段,如常用的httpcontext.current...
public a current
{
return new a();
}
实例化方法,必须由实例化对象调用,这是面向对象的根本原则
扩展方法
你可以将这些方法放在pagebase类中,login继承自pagebase,那么在login中就不要实例化类了,因为是父类中的方法,直接调用就可以了
继承