【问题标题】:What class design will be change in case of promotion of roles in employee class hierarchy如果在员工等级层次结构中提升角色,将改变什么等级设计
【发布时间】:2020-04-13 22:42:16
【问题描述】:

我正在为员工管理系统构建一个简单的面向对象的继承类,但是我发现一个问题,如果某些员工获得晋升,那么我们如何处理这种情况。

此代码使用继承关系表示员工类层次结构。

#include <iostream>

using namespace std;
/* This is Employee Class */
class Employee
{
private:
    string empname;
    int empid;
    float salary;
public:
    int getSalary();
};
/* This is Manager Class  Derived from Employee */
class Manager: public Employee
{
public:
    int getSalary(); // This will return salary of manager
};
/* This is Clerk Class  Derived from Employee */
class Clerk: public Employee
{
public:
    int getSalary(); // This will return salary of clerk
};
/* This is Accountant Class Derived from Employee */
class Accountant : public Employee
{
public:
    int getSalary(); // This will return salary of Accountant
};
/* This is Accountant Class Derived from Employee */
class Developer: public Employee
{
public:
    int getSalary(); // This will return salary of Developer
};

现在如果有员工升职降职,我该如何处理呢?

假设有一天开发人员成为经理。我将如何将这些更改应用到 C++ 类中?

【问题讨论】:

  • “我发现了一个问题” 什么样的问题?一个“问题”可能意味着很多事情。
  • 您应该有一个带有(指向)Employee 对象的容器?然后一种可能的解决方案是用指向新“提升”对象的指针替换指针,并使用复制构造来复制所需的所有细节。与all_employees[some_developer_index] = new Manager(*all_employees[some_developer_index]) 一样(请注意,我简化了示例,因为它当前会泄漏内存)。

标签: c++ class oop object design-patterns


【解决方案1】:

由于对象不能改变类型,你所能做的就是谋杀老员工,然后用他们的新角色复活他/她/它/他们的副本。他们的“灵魂”能否通过这个过程保留下来,由你决定。

您的模型不会在实际程序中使用(没有双关语)。员工的“等级”或薪酬等级将是员工的财产,而不是他们的类型。员工还有很多其他属性,而且(正如您所发现的)这些属性的值可能会发生变化,因此将它们融入员工的身份是没有意义的。

并非一切都必须“面向对象”。

【讨论】:

    【解决方案2】:

    您正在寻找 State 设计模式。

    员工的角色是一种状态。正如其他人已经提到的那样,仅仅因为他们改变角色而杀死员工是没有意义的。因此,角色不应该定义员工。它应该只是一个属性。

    假设您具有以下角色层次结构:

    class Role { ... };
    
    class Developer: public Role { ... };
    
    class Manager: public Role { ... };
    

    然后:

    class Employee {
        Role role;
    ...
    };
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 2023-02-24
      • 2021-08-25
      • 2022-07-05
      • 2014-07-23
      • 2012-12-08
      • 1970-01-01
      • 2019-11-25
      相关资源
      最近更新 更多