关于班级设计的面试问题

时间:2011-03-28 09:46:38

标签: c# class-design

最近我参加了一次采访。有人质问这个问题。

这就是情景。

我们有两种类型的员工。定期和合同员工。 普通员工将在月底按固定基金支付。 合同员工将根据他们工作的小时数每周支付一次。

管理人员将被分配到这些员工进行监督。 经理可以在他下面有常规和合同雇员。

此应用程序将计算这些员工的工资单。

他们让我为这种情况提出课堂设计。

面试官对我的期待是什么? 这方面的指针将受到高度赞赏。

5 个答案:

答案 0 :(得分:6)

他们正在测试您是否了解优秀OO设计的一些基本原则。具体来说,他们似乎在寻找:

  1. 理解多态性(通过使用抽象基础级别的每个员工的功能)
  2. 了解Specialization(通过扩展基本Employee类的功能以产生不同的行为)

答案 1 :(得分:3)

如果您了解关注点的分离(计算员工的工资不是员工本身的责任),并且看看您是否理解抽象性和多态性,那么这个问题会对您进行测试:是(目前)2种不同的计算工资的方法。您可以实现某种策略设计模式以执行计算,以便在单独的类中指定算法的每个实现。这有助于维护和扩展(如果需要其他类型的算法)。

public class Employee
{
    public bool IsContractEmployee
    {
       get;
       set;
    }
}

public class WageCalculator
{

    private abstract class WageCalculAlgorithm
    { 
        public virtual decimal Calculate( Employee emp )
        {
             // regular calc goes here
        }
    }

    private class ContractorCalculator : WageCalculAgorithm
    {
        public override decimal Calculate( Employee emp )
        {
            // contractor calc goes here
        }
    }

    public static decimal CalculateWageFor( Employee emp )
    {
       if( emp.IsContractEmployee )
            return new ContractorCalculator().Calculate(emp);
       else
            return new WageCalculAlgorithm().Calculate(emp);
    }
}

答案 2 :(得分:2)

以下可能是设计之一

设计1。

public class Employee
{
   public bool isContractEmployee
      { get; set;}

   public abstract float CalCulatePayroll();   
}


public class FullTimeEmp : Employee
{
   public override float CalCulatePayroll()
   {
   }
}

public class ContractEmp : Employee
{
  public int NoofHR
      {get; set;}

  public override float CalCulatePayroll()
   {
       sal = nohr*money;
   }
}

设计2。

public class employee
{
  public bool isContractEmployee
  { get; set;}

  public int NoofHR
  {get; set;}


  public  float CalCulatePayroll()
  {
    if(this.isContractEmployee)
    {
      //calculate sal on based hr
    }
    else
    {
      //calculate regurlare sal
    }
  }
}

答案 3 :(得分:0)

面试官可能希望你尽力提出一个你认为能解决问题的解决方案。

他也希望您在提出解决方案时解释一些您做出的决定。

最后期望你自己想出解决方案而不是在互联网论坛上提出解决方案。

很难从技术上说出他的预期,因为我们不知道你的目标是什么。如果你是第一个开发人员的工作,他可能没想到你会得到正确的答案,但只是想看看你解决问题的方法是什么样的。

答案 4 :(得分:0)

我会这样:

public class Employee
{        
     public abstract int CalculateSalary();
}



public class RegularEmployee : Employee
{
    public int NumOfWeeklyHours { get; set; }
    public int CalculateSalary()
    {
            // TODO: Implement
    }
}

public class ContractEmployee : Employee
{
    public int FixedBasis { get; set; }

    public override int CalculateSalary()
    {
        // TODO: Implement
    }
}

public class Manager
{
    public List<Employee> InChargeOf { get; set; }
}

public class PayRoll
{
    public int CalculateSalaries(List<Employee> le)
    {
         return le.Sum(e => e.CalculateSalary());
    }
}