我正在学习面向对象的概念。正如我从我所读的文档中了解到的,我用OOP编写了一个封装概念示例程序。我把代码贴在下面。我对封装的概念正确吗?
Default.aspx
<asp:Button ID="showBtn" Text="Show employee details." runat="server"/>Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
Employee emp;
protected void Page_Load(object sender, EventArgs e)
{
emp = new Employee();
emp.SetEmployeeID(001);
emp.SetEmployeeSalary(5000);
emp.EmployeeName = "Rob";
emp.EmployeeAge = 26;
showBtn.Click += new EventHandler(showBtn_Click);
}
void showBtn_Click(object sender, EventArgs e)
{
emp.ShowEmployeeDetails();
}
}级员工
class Employee
{
private int empId;
private int empSalary;
private string empName;
private int empAge;
public void SetEmployeeID(int id)
{
empId = id; //Mutator
}
public void SetEmployeeSalary(int sal)
{
empSalary = sal; //Mutator
}
public int GetEmployeeID()
{
return empId; //Accessor
}
public int GetEmployeeSalary()
{
return empSalary; //Accessor
}
public string EmployeeName
{
get { return empName; } //Accessor
set { empName = value; } //Mutator
}
public int EmployeeAge
{
get { return empAge; } //Accessor
set { empAge = value; } //Mutator
}
private void ShowDetails()
{
HttpContext.Current.Response.Write(this.GetEmployeeID() + " : " + this.EmployeeName + " : " + this.EmployeeAge + " : " + this.GetEmployeeSalary());
}
public void ShowEmployeeDetails()
{
ShowDetails();
}
}我主要怀疑的是我在雇员中调用ShowDetails()方法的方式。这是隐藏方法ShowDetails()的好方法吗?
发布于 2013-02-06 07:25:51
从面向对象的角度来看,您的ShowDetails方法正在做两件非常不同的事情。
现在,第一个任务确实属于类Employee,您需要知道雇员能够创建一个代表对象的字符串。事实上,在.net中,这是一件很常见的事情,实际上有一个名为Object.ToString()的“可重写”或“虚拟”函数。
第二个任务与类雇员完全无关,与字符串和HttpResponses有很大关系(在本例中,我们如何获得HttpResponse,即从HttpContext获取它,这意味着我们必须在HttpRequest中的we服务器上)。有了所有这些假设,在一个通用的“数据”或“域”类中,它是非常不安全的。
这就是我要重构这个的方法。
class Employee
{
private int empId;
private int empSalary;
private string empName;
private int empAge;
public void SetEmployeeID(int id)
{
empId = id; //Mutator
}
public void SetEmployeeSalary(int sal)
{
empSalary = sal; //Mutator
}
public int GetEmployeeID()
{
return empId; //Accessor
}
public int GetEmployeeSalary()
{
return empSalary; //Accessor
}
public string EmployeeName
{
get { return empName; } //Accessor
set { empName = value; } //Mutator
}
public int EmployeeAge
{
get { return empAge; } //Accessor
set { empAge = value; } //Mutator
}
public override string ToString()
{
return this.GetEmployeeID() + " : " +
this.EmployeeName + " : " +
this.EmployeeAge + " : " +
this.GetEmployeeSalary();
}
}和
public partial class _Default : System.Web.UI.Page
{
Employee emp;
protected void Page_Load(object sender, EventArgs e)
{
emp = new Employee();
emp.SetEmployeeID(001);
emp.SetEmployeeSalary(5000);
emp.EmployeeName = "Rob";
emp.EmployeeAge = 26;
showBtn.Click += new EventHandler(showBtn_Click);
}
void showBtn_Click(object sender, EventArgs e)
{
HttpContext.Current.Response.Write(emp.ToString());
}
}因为我们确实知道网页中有一个有效的HttpContext.Current。因此,员工不需要了解互联网,也同样能够在WinForm应用程序上工作。
发布于 2013-02-06 06:52:07
我认为你的主要怀疑是好的。您的employee对象正在承担它可能不应该承担的责任,比如向HttpContext写入。如果此输出字符串很常见,则可以重写在.NET中找到的.NET操作符,删除ShowDetails,并在单击按钮时添加此操作:
HttpContext.Current.Response.Write(emp.ToString())https://stackoverflow.com/questions/14723126
复制相似问题