我想定义两个具有不同参数但名称相同的方法。可能吗?
假设我有两个班级,第一个是小时工,第二个是委托员工,另一个是界面方法:
GetSalaryInformation()
我想定义两个这样的方法 适用于每小时员工
GetSalaryInformation(int hourToWork)
和委托员工
GetSalaryInformation(float howmuchSold)
答案 0 :(得分:3)
否你不能这样做;至少不是你想的那样。
接口的实现者可能不会更改接口上方法的签名(当然,他们可以添加自己的签名)。
因此,此代码不有效:
interface IEmployee
{
void PayMe()
}
class Salaried : IEmployee
{
void PayMe(int salary) { }
}
class Hourly : IEmployee
{
void PayMe(int rate, int hours) { }
}
两个派生类必须具有PayMe
且没有参数。这非常重要;如果参数不断变化,则无法使用IEmployee
引用调用该方法(如何知道要传递的参数?)。
现在;除了他们自己的参数化版本之外,每个派生类都可以实现无参数PayMe 但是那时你没有通过界面所以...为什么你正在困扰界面?
答案 1 :(得分:3)
您希望接口可替换。您的愿望是准确的,但您的实施不是类型安全的。您可以将界面重新编写为可替换的,并获得您正在追逐的多态性:
void Main()
{
var emp = new CommissionedEmployee();
emp.ProductsSold = 100;
var emp2 = new SalariedEmployee();
emp2.HoursWorked = 160;
var employees = new List<IEmployee> {emp, emp2};
foreach (var e in employees)
{
e.GetSalaryInformation();
}
}
interface IEmployee
{
void GetSalaryInformation();
}
class SalariedEmployee : IEmployee
{
public int HoursWorked { get; set; }
private int someFixedRateIMadeupForDemo = 15;
public void GetSalaryInformation()
{
Console.WriteLine($"Salary: {HoursWorked * someFixedRateIMadeupForDemo}");
}
}
class CommissionedEmployee : IEmployee
{
public float ProductsSold {get;set; }
private int someFixedRateIMadeupForDemo = 25;
public void GetSalaryInformation()
{
Console.WriteLine($"Salary: {ProductsSold * someFixedRateIMadeupForDemo}");
}
}
这是一个人为的例子,但希望你能得到基本的想法。如果你想深入了解这些东西,你可以深入研究“利斯科夫替代原则”。
答案 2 :(得分:1)
我想,您可以使用扩展方法解决您的问题:
static void Main(string[] args)
{
var salaried = new Salaried();
var hourly = new Hourly();
salaried.PayMe(100);
hourly.PayMe(100, 8);
}
class Salaried { }
class Hourly { }
static class ExtensionMethods
{
public static void PayMe(this Salaried salaried, int salary)
{
// Do something
}
public static void PayMe(this Hourly hourly, int salary, int hours)
{
// Do something
}
}