Program类中的抽象方法与静态方法

本文关键字:静态方法 抽象方法 Program | 更新日期: 2023-09-27 18:20:01

假设我有一个简单的继承链,其中Employee是抽象基类,CheckoutManager在这个纯粹说明性的控制台应用程序中从中继承。现在,我想要一个方法,该方法将接收类型为ManagerCheckout的对象,并根据员工在公司中的职位返回整数金额的奖金。我对此有一些初步的想法,如果这个控制台应用程序有朝一日成长为一个数据驱动的网络应用程序,我想知道每种方法可能带来的长期缺陷或收益。

  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-a是否为Manager。

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

Program类中的抽象方法与静态方法

您缺少传统的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());

我想你真的已经回答了自己的问题。

我的派生类实现了一个名为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; }
  }
}

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

我认为抽象效果很好:

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

这就是你需要的吗?