View Full Version : 关于一个类的实例的初始化的问题


FORREST
04-13-2007, 02:11 AM
各位好:
遇到如下问题,在一个系统中设计了注册用户类 RegUser 和部门类 Department,
一个RegUser必须要属于一个Department,类结构定义如下:

public class RegUser
{
private int id;
private string name;
private datetime regtime;
private Department department;//该用户所属类

//Property操作
//所属部门
public Department Department
{
set
{
this.department=value;
}
get
{
return this.department;
}
}

public RegUser()
{
//to do
}
//根据传入的用户名构造器
public RegUser(string name):this()
{
//在另外一个类RegUserService中进行数据库存取操作
(new RegUserService()).LoginUser(name);
}
}

public class Department
{
private int id;
private bool isManageDept;
private string name;
private ArrayList regUsers;//表示所有该部门下面的RegUser的集合

//从数据库中取得一个部门的信息
public Department(int id):this()
{
(new DepartmentService()).department(id);
}
}

public class RegUserService
{
public RegUser LoginUser(string username)
{
//数据库代码连接得到connection
sqlstr = "select * from reguser where"
//此处省略若干代码
loginuser = new RegUser();
loginuser.ID = datareader["ID"];
loginuser.Name = datareader["Name"];
loginuser.RegTime = datareader["RegTime"];
//获取当前用户的部门
Department department = new Department(deptid);
//得到该对象
loginuser.Department = department;

return loginuser;

}
}

public class DepartmentService
{
public Department Department(int id)
{
Department dept;
SqlConnection conn = DBConnection.OpenConn();
try
{
if (conn != null)
{
//string sqlstr = "SELECT * FROM tb_Department WHERE f_ID = @ID";
string sqlstr = "SELECT * FROM tb_Department WHERE f_ID = " + id;
SqlCommand cmd = new SqlCommand(sqlstr,conn);
//cmd.Parameters.Add("@ID",SqlDbType.Int,4,id.ToString());
cmd.CommandType = CommandType.Text;

SqlDataReader dtr = cmd.ExecuteReader(CommandBehavior.SingleRow);

if (dtr.Read())
{
dept = new Department();
dept.ID = int.Parse(dtr["f_ID"].ToString());
dept.DeptName = dtr["f_DeptName"].ToString();
dept.ContactPerson = dtr["f_ContactPerson"].ToString();
dept.ContactPhone = dtr["f_ContactPhone"].ToString();
dept.ContactEMail = dtr["f_ContactEMail"].ToString();
dept.IsManageDept = bool.Parse(dtr["f_IsManageDept"].ToString());
}
else
{
dept = null;
}

}
else
{
dept =null;
}
}
catch
{
dept = null;
}
finally
{
DBConnection.CloseConn(conn);
}
return dept;

}
}



我的类设计基本就是如上:
一个页面上有如下逻辑:
当一个注册用户所属的部门未管理部门的时候,执行某种工作:
所以我这样做:
RegUser loginUser = new RegUser("xxx");
if (loginUser.Department.IsManageDept)
{
//to do
}
但是在这里发现loginUser.Department总是为null.

我刚开始学习面向对象的编程,怀疑是department传递的时候已经超出了其生存期,所
以丢失了!

请各位帮忙,如果是这个原因,应该怎么在Property Department中操作呢?


谢谢!

绉﹂鎰忓姩
04-13-2007, 07:06 AM
public class RegUser
{
private int id;
private string name;
private datetime regtime;
private Department department;//璇ョ敤鎴锋墍灞炵被

//Property鎿嶄綔
//鎵灞為儴闂
public Department Department
{
set
{
this.department = value;
}
get
{
return this.department;
}
}

public RegUser()
{
//to do
}
//鏍规嵁浼犲叆鐨勭敤鎴峰悕鏋勯犲櫒
public static RegUser create(string name)

{
//鍦ㄥ彟澶栦竴涓被RegUserService涓繘琛屾暟鎹簱瀛樺彇鎿嶄綔
return (new RegUserService()).LoginUser(name);
}
}

public class Department
{
private int id;
private bool isManageDept;
private string name;
private ArrayList regUsers;//琛ㄧず鎵鏈夎閮ㄩ棬涓嬮潰鐨凴egUser鐨勯泦鍚

//浠庢暟鎹簱涓彇寰椾竴涓儴闂ㄧ殑淇℃伅
public static Department create(int id)
{
return (new DepartmentService()).department(id);
}
}

public class RegUserService
{
public RegUser LoginUser(string username)
{
//鏁版嵁搴撲唬鐮佽繛鎺ュ緱鍒癱onnection
sqlstr = "select * from reguser where"
//姝ゅ鐪佺暐鑻ュ共浠g爜
loginuser = new RegUser();
loginuser.ID = datareader["ID"];
loginuser.Name = datareader["Name"];
loginuser.RegTime = datareader["RegTime"];
//鑾峰彇褰撳墠鐢ㄦ埛鐨勯儴闂
Department department = Department.create(deptid);
//寰楀埌璇ュ璞
loginuser.Department = department;

return loginuser;

}
}

public class DepartmentService
{
public Department Department(int id)
{
Department dept;
SqlConnection conn = DBConnection.OpenConn();
try
{
if (conn != null)
{
//string sqlstr = "SELECT * FROM tb_Department WHERE
f_ID = @ID";
string sqlstr = "SELECT * FROM tb_Department WHERE f_ID
= " + id;
SqlCommand cmd = new SqlCommand(sqlstr, conn);
//cmd.Parameters.Add("@ID",SqlDbType.Int,4,id.ToString());
cmd.CommandType = CommandType.Text;

SqlDataReader dtr =
cmd.ExecuteReader(CommandBehavior.SingleRow);

if (dtr.Read())
{
dept = new Department();
dept.ID = int.Parse(dtr["f_ID"].ToString());
dept.DeptName = dtr["f_DeptName"].ToString();
dept.ContactPerson =
dtr["f_ContactPerson"].ToString();
dept.ContactPhone = dtr["f_ContactPhone"].ToString();
dept.ContactEMail = dtr["f_ContactEMail"].ToString();
dept.IsManageDept =
bool.Parse(dtr["f_IsManageDept"].ToString());
}
else
{
dept = null;
}

}
else
{
dept = null;
}
}
catch
{
dept = null;
}
finally
{
DBConnection.CloseConn(conn);
}
return dept;

}
}



浣跨敤锛
RegUser loginUser = RegUser.create("xxx");
if (loginUser.Department.IsManageDept)
{
//to do
}

濡傛灉杩樻槸null
璇锋鏌ヤ綘鐨剆ql璇彞鍜宖_ID 锛屾斁鍒版暟鎹簱涓幓鏌ユf_ID 鏄惁瀵瑰簲鐨勬湁鏁版嵁

FORREST
04-13-2007, 09:20 AM
您好:
感谢您的回复,因为机器原因,现在无法调试您的方法。
我现在不知道我的方法错在哪里了, 已经排除了“sql语句和f_ID ,放到数据库
中去查此f_ID 是否对应的有数据”这个问题,通过逐步调试,可以发现,Department
已经被赋值,而且IsMangeDept=true,但是当最后页面上调用LoginUser的时候,这时候
其他属性都存在,就是LoginUser.Department为null,实在搞不懂怎么回事!

另外请问一个问题,关于RegUser这个类的id这个属性,本意设计上应该是只读属
性,也就是一个用户被创建以后,ID就不能被更改了,我的想法是传入nickname,就从数
据库里面取出相关的信息填充该user,那么如果RegUser.ID如果是只读就没法给这个ID
赋值了,而改成读写属性以后,创建以后可以随意的使用LoginUser.ID = 'x'就改变了
这个数据,请问这种实例化一个对象应该怎么操作呢?

谢谢!

"秦风意动" <@discussions.microsoft.com> 写入邮件
news:9CA1BDF6-11C9-4168-B545-E317E5ED8E5C@microsoft.com...
> public class RegUser
> {
> private int id;
> private string name;
> private datetime regtime;
> private Department department;//该用户所属类
>
> //Property操作
> //所属部门
> public Department Department
> {
> set
> {
> this.department = value;
> }
> get
> {
> return this.department;
> }
> }
>
> public RegUser()
> {
> //to do
> }
> //根据传入的用户名构造器
> public static RegUser create(string name)
>
> {
> //在另外一个类RegUserService中进行数据库存取操作
> return (new RegUserService()).LoginUser(name);
> }
> }
>
> public class Department
> {
> private int id;
> private bool isManageDept;
> private string name;
> private ArrayList regUsers;//表示所有该部门下面的RegUser的集合
>
> //从数据库中取得一个部门的信息
> public static Department create(int id)
> {
> return (new DepartmentService()).department(id);
> }
> }
>
> public class RegUserService
> {
> public RegUser LoginUser(string username)
> {
> //数据库代码连接得到connection
> sqlstr = "select * from reguser where"
> //此处省略若干代码
> loginuser = new RegUser();
> loginuser.ID = datareader["ID"];
> loginuser.Name = datareader["Name"];
> loginuser.RegTime = datareader["RegTime"];
> //获取当前用户的部门
> Department department = Department.create(deptid);
> //得到该对象
> loginuser.Department = department;
>
> return loginuser;
>
> }
> }
>
> public class DepartmentService
> {
> public Department Department(int id)
> {
> Department dept;
> SqlConnection conn = DBConnection.OpenConn();
> try
> {
> if (conn != null)
> {
> //string sqlstr = "SELECT * FROM tb_Department WHERE
> f_ID = @ID";
> string sqlstr = "SELECT * FROM tb_Department WHERE
f_ID
> = " + id;
> SqlCommand cmd = new SqlCommand(sqlstr, conn);
>
//cmd.Parameters.Add("@ID",SqlDbType.Int,4,id.ToString());
> cmd.CommandType = CommandType.Text;
>
> SqlDataReader dtr =
> cmd.ExecuteReader(CommandBehavior.SingleRow);
>
> if (dtr.Read())
> {
> dept = new Department();
> dept.ID = int.Parse(dtr["f_ID"].ToString());
> dept.DeptName = dtr["f_DeptName"].ToString();
> dept.ContactPerson =
> dtr["f_ContactPerson"].ToString();
> dept.ContactPhone =
dtr["f_ContactPhone"].ToString();
> dept.ContactEMail =
dtr["f_ContactEMail"].ToString();
> dept.IsManageDept =
> bool.Parse(dtr["f_IsManageDept"].ToString());
> }
> else
> {
> dept = null;
> }
>
> }
> else
> {
> dept = null;
> }
> }
> catch
> {
> dept = null;
> }
> finally
> {
> DBConnection.CloseConn(conn);
> }
> return dept;
>
> }
> }
>
>
>
> 使用:
> RegUser loginUser = RegUser.create("xxx");
> if (loginUser.Department.IsManageDept)
> {
> //to do
> }
>
> 如果还是null
> 请检查你的sql语句和f_ID ,放到数据库中去查此f_ID 是否对应的有数据
>