【问题标题】:is it posible to relate two different classes that contains same method but with different parameters?是否可以关联两个包含相同方法但具有不同参数的不同类?
【发布时间】:2014-09-17 03:23:15
【问题描述】:

我正在定义一个接口来分组两个不同的子类。每个类都实现了继承方法,但每个类都需要不同的参数才能工作。

这是界面。

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

如您所见,从概念上讲,他们使用方法来实现相同的目的,即对服务收费。这就是我最初考虑继承的原因,但似乎这不是最好的方法。

还有哪些其他选择可以使类相互关联?

【问题讨论】:

  • 将方法的签名定义为public decimal Bill(int base, decimal rate)。这种将广泛量作为不同广泛量乘以密集量的乘积的模式是常见的位置模式。
  • 我不认为尝试在接口方法签名中包含所有必需的参数是一个好主意,这会使接口变得脆弱。

标签: c# oop


【解决方案1】:

这并没有直接回答您标题中的问题,但您确实要求其他替代方案...

你的接口是一个契约,保证你的类将有一个返回小数的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...
    }
}

【讨论】:

    【解决方案2】:

    不确定这是否是最好的方法,但我认为您使用接口的方法很好(按照惯例我称之为 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 方法,它会使用实例属性来计算值。

    这将使您保持界面签名一致。

    注意:语法可能已关闭,但希望您能理解。

    【讨论】:

    • 酷。很高兴我能帮上忙。格兰特的回答建议使用相同的技术,所以这很好。他将它构建到相同的 Employee 类中,我在其中使用了一个单独的类,略有不同,但我仍然认为最好将 Billing 从 Employer 类中删除,因为我们需要为同一个 Employee 一遍又一遍地计费。跨度>
    【解决方案3】:

    显然,您的建议会产生语法错误,因为接口的每个实现都应实现其所有原型方法。根据定义,实现原型意味着拥有相同参数,这就是为什么你不能为同一个方法拥有多个参数。 不过,您可以利用 .NET 4.0 中的可选参数 introduced

    所以你可以有this之类的东西。

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 1970-01-01
      • 2021-09-02
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多