接口类

Exp*_* be 6 c# oop interface

我不清楚使用接口类清楚.我阅读了很多关于接口类相关OOP的文章和教程,所以我知道接口是什么,但我确实理解在实际项目中使用.

例如,

我做了IPayment接口类.我定义了2种使用所有支付类共同的方法.

public interface IPayment 
{
  void MakePayment(OrderInfo orderInfo);
  void MakeRefund (OrderInfo orderInfo);
}
Run Code Online (Sandbox Code Playgroud)

我做了3个支付类,分别是CreditCardPayment,PaypalPayment和GooglePayment.

我在每个类中定义了2个方法.

我在这部分感到困惑,我需要创建包含需要用于处理付款或退款的订单信息的OrderInfo类.每个班级都需要不同的信息.

CreditCartPayment类需要信用卡号,到期日....但其他支付类不是.

GooglePayment类需要Google订单号,但其他类不需要.

所以,最后OrderInfo类必须有许多额外的字段.它看起来很脏......

例)

Public class OrderInfo 
{
  /* For Common */
  string orderNo {get; set;}
  string customerNo { get; set;}
  decimal amount {get; set;}

  /* For Credit Card */
  string CCNum {get; set;}
  string expDate { get; set;}

  /* For Google */
  string googleOrderID {get; set;}
  ...

  /* For Paypal */
  ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,

在这种情况下,使用IPayment是否正确?或者我需要在没有Interface类的情况下使用正确的参数定义每个类?

我想使用Interface类的优势很容易在以后找出付款类.因为Interface类将显示每个支付类中定义的方法.还有其他职业选手吗?

你对现实世界中的Interface类有什么建议吗?

[编辑]

谢谢你的所有建议.

我再次编写示例代码.你可以查看这段代码吗?

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();
}
Run Code Online (Sandbox Code Playgroud)

它发生错误:

错误1'com.WebUI.Models.CreditCardPaymentInfo'未实现接口成员'com.WebUI.Models.IPaymentProcess.makeRefund(WebUI.Models.RefundModel)'

我想我需要修复Interface类.有人知道我该怎么办呢?

Dan*_*n J 6

一种方法是创建OrderInfo基类并使其特定于提供者的支付类型的子类,如下所示:

public class OrderInfo 
{
  /* For Common - Protected members are accessible to subclasses! */
  protected string OrderNo {get; set;}
  protected string CustomerNo { get; set;}
  protected decimal Amount {get; set;}
}

public class CreditCardPaymentInfo : OrderInfo
{
  /* For Credit Card */
  string CCNum {get; set;}
  string ExpDate { get; set;}
}

public class GooglePaymentInfo : OrderInfo
{
  /* For Google */
  string GoogleOrderID {get; set;}
  ...
}

public class PaypalPaymentInfo : OrderInfo
{
  /* For Paypal */
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样实施您的付款类,并满足IPayment接口的要求:

public class PaypalPayment : IPayment
{
    public void MakePayment(PaypalPaymentInfo orderInfo)
    {
      ...
    }

    public void MakeRefund (PaypalPaymentInfo orderInfo)
    {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

因为PaypalPaymentInfo可以在OrderInfo指定的任何地方使用,所以这是一个有效的实现IPayment.您可以按照相同的模式进行信用卡和Google付款实施.


Jor*_*aye 5

实现这一目标的正确方法是为每种类型的付款创建一个类,但将它们用作一般付款IPayment.所以你有:

public class CreditPayment : IPayment

public class GooglePayment : IPayment

public class PaypalPayment : IPayment

然后使用付款:

public class PaymentUser
{
   private IPayment _payment;

   public PaymentUser(//args)
   {
      //Which payment to be used would be based on args. Using a factory here is common
      _payment = new CreditPayment(//args);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在你已经IPayment为你创建了一个,除了知道它符合你的合同之外,你不关心它是什么类型!

所以你可以说在某个地方

public void MakePayment(OrderInfo order)
{
   _payment.MakePayment(order);
}
Run Code Online (Sandbox Code Playgroud)

你甚至不知道IPayment你使用的是哪种类型.这增加了可扩展性,因为只要它遵循IPayment接口,您就不关心执行该方法的类型.