[英]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.