程序类中的抽象方法与静态方法

woo*_*gie 0 c# visual-studio-2010

假设我有一个简单的继承链,其中Employee是抽象基类,CheckoutManager在这个纯粹的说明性控制台应用程序中继承它.现在我想有一个将在类型的对象的方法ManagerCheckout并返回取决于该公司员工的位置奖金的整数金额.我有一些初步的想法,如果这个控制台应用程序有一天成长为一个数据驱动的Web应用程序,我想知道每种方法的潜在长期缺陷或收益.

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

    abstract class Employee
        {
            public int EmployeeId { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
    
    
        }
    
    Run Code Online (Sandbox Code Playgroud)

    我的派生类实现了一个界面,用于将员工信息打印到调用的控制台,IPrintable并且只有一个方法可以执行此操作.虽然这个界面与赠送奖金无关,但我在课堂上用我的Main方法生活模拟了以下内容,程序运行正常.

    static int GiveBonusesViaInterface(IPrintable i)
            {
                if (i is Checkout)
                    return 1000;
                else 
                    return 2000;
    
    
            }
    
    Run Code Online (Sandbox Code Playgroud)

    在我看来,如果我想为此使用一个接口,我应该制作另一个特定于加注而不是在已经实现的接口上使用它(但这是另一天的另一个问题).

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

    public static int GiveBonus(Employee e)
            {
                if (e is Manager)
                    return 2000;
                else
                    return 1000;
            }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在抽象基类中创建一个抽象方法,并在他们认为合适的情况下实现nave派生类

    abstract class Employee
    //fields and constructors
    {
    public abstract int GiveBonusesViaAbstractMethod(Employee e); 
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

Joe*_*nos 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());
Run Code Online (Sandbox Code Playgroud)