首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

OOP封装
EN

Stack Overflow用户
提问于 2013-02-06 06:43:44
回答 2查看 727关注 0票数 1

我正在学习面向对象的概念。正如我从我所读的文档中了解到的,我用OOP编写了一个封装概念示例程序。我把代码贴在下面。我对封装的概念正确吗?

Default.aspx

代码语言:javascript
运行
复制
<asp:Button ID="showBtn" Text="Show employee details." runat="server"/>

Default.aspx.cs

代码语言:javascript
运行
复制
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();
}
}

级员工

代码语言:javascript
运行
复制
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()的好方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-06 07:25:51

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

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

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

第二个任务与类雇员完全无关,与字符串和HttpResponses有很大关系(在本例中,我们如何获得HttpResponse,即从HttpContext获取它,这意味着我们必须在HttpRequest中的we服务器上)。有了所有这些假设,在一个通用的“数据”或“域”类中,它是非常不安全的。

这就是我要重构这个的方法。

代码语言:javascript
运行
复制
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();
    }


}

代码语言:javascript
运行
复制
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应用程序上工作。

票数 3
EN

Stack Overflow用户

发布于 2013-02-06 06:52:07

我认为你的主要怀疑是好的。您的employee对象正在承担它可能不应该承担的责任,比如向HttpContext写入。如果此输出字符串很常见,则可以重写在.NET中找到的.NET操作符,删除ShowDetails,并在单击按钮时添加此操作:

代码语言:javascript
运行
复制
HttpContext.Current.Response.Write(emp.ToString())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14723126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档