簡體   English   中英

在具有不同參數的接口中定義方法(C#)

[英]Define a method in interface with different parameters (C#)

我想定義兩個具有不同參數但名稱相同的方法。 可能嗎?

假設我有兩個類,第一個是小時工,第二個是委托員工,另一個是界面中的方法:

 GetSalaryInformation() 

我想為每小時員工定義兩個這樣的方法

 GetSalaryInformation(int hourToWork)

對於委托的員工

 GetSalaryInformation(float howmuchSold)

不,你不能這樣做; 至少不是你的想法。

接口的實現者可能不會更改接口上方法的簽名(當然,他們可以添加自己的方法)。

所以這段代碼是無效的:

interface IEmployee
{
    void PayMe()
}

class Salaried : IEmployee 
{
    void PayMe(int salary) { }
}

class Hourly : IEmployee
{
    void PayMe(int rate, int hours) { }
}

兩個派生類必須具有沒有參數的PayMe 這非常重要; 如果參數不斷變化,你不能用IEmployee引用調用該方法(你怎么知道要傳遞什么參數???)。

現在; 除了他們自己的參數化版本之外,每個派生類都可以實現no param PayMe 但是那時你沒有通過界面所以...為什么你要完全打擾界面?

您希望接口可以替換。 您的願望是准確的,但您的實施不是類型安全的。 您可以將界面重新編寫為可替換的,並獲取您正在追逐的多態性:

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}");
    }
}

這是一個人為的例子,但希望你能得到基本的想法。 如果你想深入了解這些東西,你可以深入研究“利斯科夫替代原則”。

我想,您可以使用擴展方法解決您的問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM