2

Interfaceクラスを使用しようとしていますが、Interfaceメソッドのパラメーターについて質問があります。

子クラスに特定のメソッドを使用させるためのInterfaceクラスがあります。ただし、子クラスには、メソッドに異なる数のパラメーターが必要です。

例、

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; }
}

Googleと実装PayPayは、から必要なパラメータのみを使用しますPaymentParameters

于 2012-04-18T14:23:59.427 に答える
5

さて、インターフェースの原則は、実装について知らないことです。Googleしたがって、インターフェイスの呼び出し元は、それがPayPayサブクラスのものであるかどうかを知らず、常に同じメソッドを呼び出します。

ただし、より複雑なパラメータがある場合はIPaymentParameters、このプロトタイプのメソッドを使用する必要があります

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

そして2つの実装GooglePayementParametersPayPayPaymentParameters

于 2012-04-18T14:22:26.120 に答える
4

あなたPayPayGoogleクラスは、支払いを説明するために必要なデータを表していますか?通常、Paymentクラスは支払いを表す必要があります。クラスの仕事が支払いを処理することである場合、それはおそらくのような名前を持ち、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

2つのインターフェースを定義するか、以下を使用できます。

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 に答える