gpt4 book ai didi

c# - OOP 中的封装

转载 作者:太空宇宙 更新时间:2023-11-03 21:50:39 25 4
gpt4 key购买 nike

我正在研究 OOP 概念。正如我从阅读的文档中了解到的那样,我为 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)员工

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();
}
}

我的主要疑问是我在 Employee 中调用 ShowDetails() 方法的方式。这是隐藏方法 ShowDetails() 的好方法吗?

最佳答案

从面向对象的角度来看,您的 ShowDetails 方法正在做两件截然不同的事情。

  • 创建表示对象的字符串
  • 将字符串输出到 HttpResponse。

现在第一个任务确实属于 Employee 类,您需要知道员工是什么才能创建代表该对象的字符串。事实上,在 .net 中这是很常见的事情,实际上有一个名为 Object.ToString() 的“可覆盖”或“虚拟”函数。

第二个任务与 Employee 类完全无关,而与字符串和 HttpResponses 有很多关系(在这种情况下,我们如何获得 HttpResponse,即从 HttpContext 中获取它,这意味着我们必须在 HttpRequest 中的网络服务器上)。有了所有这些假设,它在通用“数据”或“域”类中是极其不安全的。

这就是我重构它的方式。

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 应用程序上工作。

关于c# - OOP 中的封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14723126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com