2

我正在尝试使用接口类,但我对接口方法参数有疑问。

我有一个接口类让子类使用特定的方法。但是子类需要不同数量的方法参数。

例子,

public interface IPayment
{
  void MakePayment();
}

并在子类中定义 MakePayment 方法。

public class PayPay : IPayment
{
  public void MakePayment(string a); // it needs only one parameter
}

public class Google : IPayment
{
  public void MakePayment(string a, int b); // it needs two parameters.
}

像上面的情况一样,我怎样才能修改我的接口类?

谢谢!

4

7 回答 7

8

一个干净的方法可以是简单地使用一个PaymentParameters类并使用一个名为public void MakePayment(PaymentParameters params);

于 2012-04-18T14:19:04.723 回答
7

更改您的界面以使用包含每个不同服务可能需要的所有参数的 PaymentParameters 类。

public interface IPayment 
{ 
   void MakePayment(PaymentParameters p);   
} 

public class PaymentParameters{
    public string A { get; set; }
    public int B { get; set; }
}

您的GooglePayPay实现将仅使用来自PaymentParameters.

于 2012-04-18T14:23:59.427 回答
5

好吧,接口的原则是不知道实现。所以接口的调用者不会知道它是否是一个GooglePayPay类,并且总是会调用相同的方法。

但是如果你有更复杂的参数,你应该使用IPaymentParameters和这个原型的方法

public interface IPayment
{
     void MakePayment(IPaymentParameters parameters);
}

还有两个实现GooglePayementParametersPayPayPaymentParameters

于 2012-04-18T14:22:26.120 回答
4

您的PayPayGoogle类是否代表描述付款所需的数据?通常,支付类应该代表支付。如果该类的工作是处理付款,它可能应该有一个类似的名称PaymentProcessor,并且它的接口类似IPaymentProcessor(或者实际上IPaymentService,或类似的东西)。

如果支付类代表实际支付,那么该类的方法不需要任何参数MakePayment();相反,它将依赖实例数据来描述正在支付的款项。

或者,你可以有这样的东西(仍然Payment用来描述付款本身):

interface IPaymentProcessor<T> where T : IPayment
{
    void ProcessPayment(T payment);
}
class PayPayPaymentProcessor : IPaymentProcessor<PayPay>
{
    void ProcessPayment(PayPay payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<Google>
{
    void ProcessPayment(Google payment) { /* some implementation here */ }
}

我可能会命名类PayPayPaymentGooglePayment因此名称更清楚地代表了类型:

class PayPayPaymentProcessor : IPaymentProcessor<PayPayPayment>
{
    void ProcessPayment(PayPayPayment payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<GooglePayment>
{
    void ProcessPayment(GooglePayment payment) { /* some implementation here */ }
}

请注意,这与其他建议的使用类的方法非常相似PaymentParameters,但它更接近于单一职责原则。在 Brian Cauthon 的回答中,PaymentParameters该类必须为任何类型的付款保留所有可能参数的并集;在这里,参数类型可以(并且应该)特定于它们所代表的支付需求。

于 2012-04-18T14:32:28.093 回答
3

您可以定义两个接口,也可以使用以下接口;

public interface IPayment
{
    void MakePayment(string a, int b=0);
}

当只传递字符串参数时,该方法会将 b 设置为 0;你可以忽略它。

于 2012-04-18T14:20:44.413 回答
1

如果您使用 .NET 4.0,则可以为您的 Interface-Method 提供默认值

public interface ITest{
void Function(stirng s1, string s2 = "");
}
于 2012-04-18T14:21:15.243 回答
0

直接来自 MSDN -

接口仅包含方法、委托或事件的签名

方法的签名由方法的名称及其每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑

如果您不提供方法的实现(包括每个参数的类型和种类),那么您还没有真正“实现”接口。

祝你好运!:)

格伦

于 2012-04-18T14:25:18.673 回答