在具有不同参数的接口中定义方法(C#)

时间:2018-05-07 16:32:34

标签: c#

我想定义两个具有不同参数但名称相同的方法。可能吗?

假设我有两个班级,第一个是小时工,第二个是委托员工,另一个是界面方法:

 GetSalaryInformation() 

我想定义两个这样的方法 适用于每小时员工

 GetSalaryInformation(int hourToWork)

和委托员工

 GetSalaryInformation(float howmuchSold)

3 个答案:

答案 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
    }
}