是否可以将包含相同方法但具有不同参数的两个不同类关联起来
本文关键字:两个 起来 关联 同类 参数 包含相 方法 是否 | 更新日期: 2023-09-27 18:22:04
我正在定义一个接口来分组两个不同的子类。每个类实现inherit方法,但每个类都需要不同的参数才能工作。
这是界面。
public interface Billable()
{
decimal Bill();
}
这是头等舱
public class HourlyEmployee : Billable
{
public decimal Bill(int hoursWorked, decimal pricePerHour) { }
}
这是第二个
public class CommissionEmployee : Billable
{
public decimal Bill(decimal commisionPercentage) { }
}
正如你所看到的,从概念上讲,他们使用相同的方法来实现,即对服务收费。这就是我最初考虑继承的原因,但这似乎不是最好的方法。
还有哪些其他选择可以使类相互关联?
这并不能直接回答你标题中的问题,但你确实要求其他选择。。。
您的接口是一个契约,保证您的类将具有返回小数的Bill()
函数。但这并不意味着您必须接受该方法中的参数。
在这里,每个类的构造函数都接受参数。Bill()
方法进行计算以返回适当的值。
public interface IBillable
{
decimal Bill();
}
public class HourlyEmployee : IBillable
{
private int hoursWorked;
private decimal pricePerHour;
public HourlyEmployee(int hoursWorked, decimal pricePerHour)
{
this.hoursWorked = hoursWorked;
this.pricePerHour = pricePerHour;
}
public decimal Bill()
{
return hoursWorked * pricePerHour;
}
}
public class CommissionEmployee : IBillable
{
private int commissionPercentage;
public CommissionEmployee(int commissionPercentage)
{
this.commissionPercentage = commissionPercentage;
}
public decimal Bill()
{
// do some calculation using commissionPercentage and return a value...
}
}
不确定这是否是最好的方法,但我认为您使用接口的方法很好(根据惯例,我将其称为IBillable)。
但是,您不应该试图将计算所需的所有值作为接口方法中的参数,因为这限制了您的可扩展性,如果您遇到一种新的员工,他需要更多的值来进行账单计算,该怎么办。接口是一个不应该改变的合同,希望永远。下面建议的方法没有这个问题。
一个建议是使用另一个类(比如BillCalculator),并将Billable接口所需的不同参数移动到该类的属性中。
public abstract class BillCalculator: IBillable
{
abstract decimal Bill();
}
public class HourlyBillCalculator: BillCalculator
{
public int HoursWorked { get; set; }
public decimal PricePerHour { get; set; }
public HourlyBillCalculator(int hoursWorked, decimal pricePerHour)
{
HoursWorked = hoursWorked;
PricePerHour = pricePerHour;
}
public override Bill()
{
// Calculate the Bill
}
}
public class CommisionBillCalculator: BillCalculator {
public decimal CommisionRate { get; set; }
public CommisionBillCalculator(decimal rate)
{
CommisionRate = rate;
}
public override Bill() {
// Calculate the Bill
}
}
相应的Calculator类必须使用工厂模式或其他适合需要的东西进行实例化。然后只需要调用Bill方法,该方法将使用实例属性来计算值。
这将使您保持接口签名的一致性。
注意:语法可能不正确,但希望你明白。
显然,您的建议会产生语法错误,因为接口的每个实现都应该实现其所有原型方法。根据定义,实现原型意味着拥有相同的参数,这就是为什么同一方法不能有多个参数的原因但是,您可以利用.NET 4.0 中引入的可选参数
所以你可以有这样的东西。