如何不实例化类来调用类中的非静态方法?

rqrq 2010-04-15 04:11:53
有三个类:

base类就是用户的基本信息,b类就是处理页面的公用方法,头、尾、提示信息什么的,a类就是每个页面自己的类,比如用户登录,新闻列表什么的。

a类和b类都继承base类,现在我想在a类里引用b类,能不能不实例化b类?因为每个页面都要调用b类的header()、footer()方法来生成html的头和尾,都要new一下感觉挺麻烦的。

我看了一下使用静态方法可以实现,但是b类中的header()方法中的html标题,每个页面在引用的时候会自定义标题,所以不能用静态方法吧?例如:

b.cs:

public class pagectrl : pagebase
{
private string _pageTitle = "";

public string PageTitle
{
get { return _pageTitle; }
set { _pageTitle = value; }
}

public void Header()
{
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();
}
}
...全文
352 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb000wb 2010-11-26
  • 打赏
  • 举报
回复

public class pagectrl : pagebase
{
public static pagectrl Instance=new pagectrl();
private string _pageTitle = "";

public string PageTitle
{
get { return _pageTitle; }
set { _pageTitle = value; }
}

public void Header()
{
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>");
}
}


//调用
pagectrl.Instance.Header();

aladdin_lidx 2010-04-15
  • 打赏
  • 举报
回复
个人感觉这种设计模式本身就把a类和b类的实现倒置了,楼主不觉得用b类调用a类更合适吗?
rqrq 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jietuan 的回复:]
如果每页都要call b类,为什么不把b类的方法集成到pagebase类?
[/Quote]
如果网站的功能比较多,那pagebase类就会很庞大啊,所以要把各种公用方法归类吧?
jietuan 2010-04-15
  • 打赏
  • 举报
回复
如果每页都要call b类,为什么不把b类的方法集成到pagebase类?
rqrq 2010-04-15
  • 打赏
  • 举报
回复
不能用static,说使用static的各位都没认真看吧?

to zhoufoxcn兄:
我不是认为实例化类浪费资源,我是觉得在每个页面都要new一下觉得很麻烦,我发出来的代码只是一个例子,如果功能再复杂点,例如再加个Cache缓存类、定时清理无效数据的Task类等等,那是不是每个页面都要new一下这些类啊?
YC93336406 2010-04-15
  • 打赏
  • 举报
回复
加static 静态类
周公 2010-04-15
  • 打赏
  • 举报
回复
在这个上面斤斤计较没有必要,特别是不需要做全局访问控制的时候。
只要是正常使用,都会被GC管理和回收的。
实际上new一个class的时候,会调用父类的构造函数,并且会一直追溯到Object类的构造函数,但是你也没有感觉到慢的(特别是当你以前不知到的时候)。OOP语言都是这么做的。
如果你觉得这么不好,你可以使用面向过程的语言,如C。
周公 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 rqrq 的回复:]
有三个类:

base类就是用户的基本信息,b类就是处理页面的公用方法,头、尾、提示信息什么的,a类就是每个页面自己的类,比如用户登录,新闻列表什么的。

a类和b类都继承base类,现在我想在a类里引用b类,能不能不实例化b类?因为每个页面都要调用b类的header()、footer()方法来生成html的头和尾,都要new一下感觉挺麻烦的。

我看了一下使用静态方法可以实现,但是b……
[/Quote]
对于这种事情我觉得没有必要斤斤计较吧?
你每次访问一个aspx页面的时候,都会生成这个页面对应的class的实例?你能控制?
如果一个类里提供了很多经常需要的方法,全部写成静态的还不如写成非静态的,只需实例化一次,在类的生存周期内可以多次调用。
douyushan 2010-04-15
  • 打赏
  • 举报
回复
写成静态类不可以吗
周公 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 juedaihuaihuai 的回复:]

用反射
[/Quote]
用反射更不方便了。
rqrq 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhlu880516 的回复:]
那干嘛不写要基类里呢
或者把B类定义成静态的
[/Quote]
不写在基类中是因为按照功能分类,这个只是一个例子,如果有很多的公用类要引用,那岂不是要new一大堆?
静态方法中不能使用静态字段吧?
绝代坏坏 2010-04-15
  • 打赏
  • 举报
回复
用反射
w3c5201314 2010-04-15
  • 打赏
  • 举报
回复
你可以把b类定义成静态的,方法也是,就不用每次都new了塞
或是定义个静态类,专用来实例化b类
初吻给了烟 2010-04-15
  • 打赏
  • 举报
回复
那干嘛不写要基类里呢
或者把B类定义成静态的

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧