是否可以将包含相同方法但具有不同参数的两个不同类关联起来

本文关键字:两个 起来 关联 同类 参数 包含相 方法 是否 | 更新日期: 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 中引入的可选参数

所以你可以有这样的东西。