各位expert,请教一个继承的基本问题。

zzp_buaa 2012-05-18 02:36:56
我定义了一个基类,里面有一个静态变量
class mustinherit Base
inherit form
shared resource as object

sub new()
if resource is nothing then
resource = new Excel.Application()
end if
end sub

end class


然后有Form1和Form2两个类都继承这个基类,我想让所有继承Base的Form都关闭后才释放Resource,我该怎么做呢?
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzp_buaa 2012-06-08
  • 打赏
  • 举报
回复
多谢,这样相当于是分配了一个全局变量。
effun 2012-05-25
  • 打赏
  • 举报
回复
不好意思来晚了。我举个例子,比如可以把Resource放到Program这个类里。现在VS生成的代码里,都会把入口Main函数放到Program里,这是一个静态类,只要把Resource放到这个类里就可以了。

static class Program
{
static Excel.Application _resource;

public static Excel.Application Resource
{
get
{
// 仅在第一次访问这个属性时才创建Excel进程
if (_resource == null)
{
_resource = new Excel.Application();
}
return _resource;
}
}

// 程序主入口
static void Main()
{
// .....
Application.Run(new MainForm());
// 主窗体关闭以后清理资源
if (_resource != null)
{
// 关闭Excel进程
_resource.Quit();
}
}
}


这样就可以在窗体代码里用Program.Resource属性来访问了。
zzp_buaa 2012-05-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:
这个做法显然比用Counter单纯计数更好些。
我还尝试了另一种办法,非标准,就是在dispose中判断
if typeof(me) is MainForm then
‘释放资源
end if
判断是不是主窗体,如果是则释放资源。


我认为你有点钻牛角尖了,如果把Resource放到Form以外,可能会更容易处理。
[/Quote]

我也觉得如果放到Form之外更好处理。不过不知道怎么做,总需要一个类来对这个资源进行一些初始化的工作。
有什么好的建议吗?
effun 2012-05-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
这个做法显然比用Counter单纯计数更好些。
我还尝试了另一种办法,非标准,就是在dispose中判断
if typeof(me) is MainForm then
‘释放资源
end if
判断是不是主窗体,如果是则释放资源。
[/Quote]

我认为你有点钻牛角尖了,如果把Resource放到Form以外,可能会更容易处理。
zzp_buaa 2012-05-18
  • 打赏
  • 举报
回复
不知道大家还有没有更好的办法呢?
zzp_buaa 2012-05-18
  • 打赏
  • 举报
回复

[Quote=引用 3 楼 的回复:]

在Base类里维护一个静态列表,当类被初例化以后加到列表里,Dispose以后从列表里移除,在移除以后如果列表里没有实例,就释放Resource。
[/Quote]

这个做法显然比用Counter单纯计数更好些。
我还尝试了另一种办法,非标准,就是在dispose中判断
if typeof(me) is MainForm then
‘释放资源
end if

判断是不是主窗体,如果是则释放资源。
effun 2012-05-18
  • 打赏
  • 举报
回复
在Base类里维护一个静态列表,当类被初例化以后加到列表里,Dispose以后从列表里移除,在移除以后如果列表里没有实例,就释放Resource。
LSP学逆向 2012-05-18
  • 打赏
  • 举报
回复
只要对象还在,应该就不会释放了吧。
我是菜鸟,不懂。帮顶!up!
zzp_buaa 2012-05-18
  • 打赏
  • 举报
回复
我现在能想到的办法是再设置一个counter,每次新建一个实例就设置counter+1,每次Form关闭的时候或者Dispose的时候Counter-1,判断Counter的值来确定是否释放Resource资源。

但是不知道有没有更好的办法呢??能否判断当前没有继承该基类的派生类实例正在运行?

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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