woo*_*gie 0 c# visual-studio-2010
假设我有一个简单的继承链,其中Employee是抽象基类,Checkout并Manager在这个纯粹的说明性控制台应用程序中继承它.现在我想有一个将在类型的对象的方法Manager或Checkout并返回取决于该公司员工的位置奖金的整数金额.我有一些初步的想法,如果这个控制台应用程序有一天成长为一个数据驱动的Web应用程序,我想知道每种方法的潜在长期缺陷或收益.
使用继承类的通用接口.我的基类看起来像
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)
在我看来,如果我想为此使用一个接口,我应该制作另一个特定于加注而不是在已经实现的接口上使用它(但这是另一天的另一个问题).
在基类中使用静态方法
public static int GiveBonus(Employee e)
{
if (e is Manager)
return 2000;
else
return 1000;
}
Run Code Online (Sandbox Code Playgroud)在抽象基类中创建一个抽象方法,并在他们认为合适的情况下实现nave派生类
abstract class Employee
//fields and constructors
{
public abstract int GiveBonusesViaAbstractMethod(Employee e);
}
Run Code Online (Sandbox Code Playgroud)这对我来说似乎是最糟糕的想法,因为每个派生类中都必须有一个方法,它接受参数IPrintable或Employee类型,而在Manager类中我们必须测试员工is-a经理.
对于长期Web应用程序,1-2是否具有可扩展性和可管理性?选项3真的和我做的一样糟糕吗?
你错过了传统的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)