0

假设我有一个简单的继承链,Employee抽象基类在哪里,CheckoutManager在这个纯粹说明性的控制台应用程序中从它继承。现在我想要一个方法,它可以接收一个类型的对象,Manager或者Checkout根据员工在公司的职位返回一个整数的奖金。我对此有一些初步的想法,并且想知道如果这个控制台应用程序有朝一日成长为数据驱动的 Web 应用程序,每种方法的潜在长期缺陷或收益。

  1. 使用继承类通用的接口。我的基类看起来像

    abstract class Employee
        {
            public int EmployeeId { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
    
    
        }
    

    我的派生类实现了一个接口,该接口旨在将员工信息打印到调用的控制台IPrintable,并且只有一种方法可以这样做。虽然这个界面与给予奖金无关,但我在课堂上用我的Main方法生活模拟了以下内容,程序运行良好。

    static int GiveBonusesViaInterface(IPrintable i)
            {
                if (i is Checkout)
                    return 1000;
                else 
                    return 2000;
    
    
            }
    

    在我看来,如果我想为此使用一个界面,我可能应该制作另一个特定于加薪的界面,而不是在已经实现的界面上骑马尾(但这是另一天的另一个问题)。

  2. 在基类中使用静态方法,例如

    public static int GiveBonus(Employee e)
            {
                if (e is Manager)
                    return 2000;
                else
                    return 1000;
            }
    
  3. 在抽象基类中创建一个抽象方法,并按照他们认为合适的方式实现派生类

    abstract class Employee
    //fields and constructors
    {
    public abstract int GiveBonusesViaAbstractMethod(Employee e); 
    }
    

这对我来说似乎是最糟糕的想法,因为在每个派生类中都必须有一个方法,该方法接受参数IPrintableEmployee类型,并且在 Manager 类中,我们必须测试员工is-aManager.

对于长期的 Web 应用程序,1-2 是否同样具有可扩展性和可管理性?选项3真的和我说的一样糟糕吗?

4

4 回答 4

5

您错过了执行此操作的传统 OO 方式:

abstract class Employee {
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public abstract int GetBonusAmount();
}

class Manager : Employee {
    public override int GetBonusAmount() { return 2000; } 
}

class Checkout : Employee {
    public override int GetBonusAmount() { return 1000; } 
}

Console.WriteLine(someEmployee.GetBonusAmount());
于 2013-06-25T16:20:34.183 回答
3

我认为您确实已经回答了自己的问题。

我的派生类实现了一个接口,旨在将员工信息打印到调用的控制台IPrintable,并且只有一种方法可以这样做。虽然这个界面和给红利无关

[强调我的]

你已经有了一个接口。它被称为Employee。这样做的惯用方法是在您的抽象类上实现一个虚拟方法,并在必要时覆盖。更惯用的 C# 方法是编写一个属性并覆盖它。像这样:

abstract class Employee {
  public virtual int GetBonus()
  {
    return this.Bonus;
  }

  public virtual int Bonus { get; set; }
}

class Manager : Employee {
  public override int Bonus 
  { 
    get { return 2000; }
  }
}

class Checkout : Employee {
  public override int Bonus
  {
    get { return 1000; }
  }
}
于 2013-06-25T16:20:45.227 回答
1

在两个子类中实现 GetBonus() 方法。您应该完全避免进行“is instance of”检查。

于 2013-06-25T16:22:25.673 回答
0

我认为抽象效果很好:

abstract class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public abstract int GetVariableBonus();
}

class Manager {
    public int GetVariableBonus(){
         return 2000;
    }
}

class Employee{
    public int GetVariableBonus(){
         return 1000;
    }
}

那是你需要的吗?

于 2013-06-25T16:22:44.913 回答