1

継承された各クラスのメソッドには、異なるタイプのパラメーターが必要です。この場合、すべての子メソッドが受け入れることができるように、インターフェイスメソッドでパラメータをどのように定義する必要がありますか?

public interface IPayment 
{
  void MakePayment(OrderInfo orderInfo); // !!
  void MakeRefund (OrderInfo orderInfo); // !!
}

public class OrderInfo 
{
  protected string OrderNo {get; set;}
  protected string CustomerNo { get; set;}
  protected decimal Amount {get; set;}
}

public class CreditCardPaymentInfo : OrderInfo
{
  string CCNum {get; set;}
  string ExpDate { get; set;}
}

public class GooglePaymentInfo : OrderInfo
{
  string GoogleOrderID {get; set;}
}

public class PaypalPaymentInfo : OrderInfo
{
  string PaypalID {get; set;}
}



public void MakePayment()
{
    IPayment paymentModule;
    // Get Order Info 
    if(orderType == "Paypal"){
        paymentModule = new PaypalPayment();

        PaypalPaymentInfo orderInfo = new PaypalPaymentInfo();
        orderInfo.PaypalID = "TEST";
    }else if(orderType == "Google"){
        paymentModule = new GooglePayment();

        GooglePaymentInfo orderInfo = new GooglePaymentInfo();
        orderInfo.GoogleOrderID = "TEST";
    }else{
        paymentModule = new CreditCardPayment();

        CreditCardPaymentInfo orderInfo = new CreditCardPaymentInfo();
        orderInfo.CCNum = "1111111111111111";
        orderInfo.ExpDate = "11/11";
    }

    orderInfo.OrderNo = "123";
    orderInfo.CustomerNo = "ABC";
    orderInfo.Amount = 12.20m;

    paymentModule.MakePayment();
}

エラーが発生します:

エラー1'com.WebUI.Models.CreditCardPaymentInfo'はインターフェイスメンバー'com.WebUI.Models.IPaymentProcess.makeRefund(WebUI.Models.RefundModel)'を実装していません

[編集]

モデルコードを忘れてしまった、こんな感じ、

public class CreditCardPayment: IPayment 
{
  public void MakePayment(CreditCardPaymentInfo creditCardPaymentInfo ){...}
  //The parameter type is NOT OrderInfo 
  //public void MakePayment(OrderInfo orderInfo){...}
  public void MakeRefund(CreditCardPaymentInfo creditCardPaymentInfo ){...}
}

ただし、CreditCardPaymentの場合、共通フィールドのみを含むOrderInfoではなくCreditCardPaymentInfoパラメーターを渡す必要があります。

4

1 に答える 1

5
public interface IPayment<T> 
    where T: OrderInfo
{
  void MakePayment( T orderInfo );
  void MakeRefund ( T orderInfo );
}

それで:

public class CreditCardPayment
    : IPayment<CreditCardPaymentInfo>
{
    public void MakePayment( CreditCardPaymentInfo creditCardPaymentInfo ) {
        // ...
    }

    public void MakeRefund( CreditCardPaymentInfo creditCardPaymentInfo ) {
        // ...
    }
}

と:

public class CreditCardPaymentInfo
    : OrderInfo
{
    public string CCNum { get; set; }
    public string ExpDate { get; set; }
}
于 2012-11-03T13:47:22.133 に答える