假设我有一个简单的继承链,Employee
抽象基类在哪里,Checkout
并Manager
在这个纯粹说明性的控制台应用程序中从它继承。现在我想要一个方法,它可以接收一个类型的对象,Manager
或者Checkout
根据员工在公司的职位返回一个整数的奖金。我对此有一些初步的想法,并且想知道如果这个控制台应用程序有朝一日成长为数据驱动的 Web 应用程序,每种方法的潜在长期缺陷或收益。
使用继承类通用的接口。我的基类看起来像
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; }
在我看来,如果我想为此使用一个界面,我可能应该制作另一个特定于加薪的界面,而不是在已经实现的界面上骑马尾(但这是另一天的另一个问题)。
在基类中使用静态方法,例如
public static int GiveBonus(Employee e) { if (e is Manager) return 2000; else return 1000; }
在抽象基类中创建一个抽象方法,并按照他们认为合适的方式实现派生类
abstract class Employee //fields and constructors { public abstract int GiveBonusesViaAbstractMethod(Employee e); }
这对我来说似乎是最糟糕的想法,因为在每个派生类中都必须有一个方法,该方法接受参数IPrintable
或Employee
类型,并且在 Manager 类中,我们必须测试员工is-a
Manager.
对于长期的 Web 应用程序,1-2 是否同样具有可扩展性和可管理性?选项3真的和我说的一样糟糕吗?