c# - 接口(interface)类

标签 c# oop interface

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

例如,

我制作了IPayment接口(interface)类。并且我定义了 2 个使用所有支付类通用的方法。

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

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

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

我对这部分感到困惑,我需要制作包含订单信息的 OrderInfo 类,这些订单信息需要用于处理付款或退款。 每个类(class)需要不同的信息。

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 */
  ...
}

我的问题是,

这样的话,用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();
}

出现错误:

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

我想我需要修复接口(interface)类。有人知道我该如何解决吗?

最佳答案

一种方法是使 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 */
  ...
}

然后您可以像这样实现您的支付类,并满足 IPayment 接口(interface)的要求:

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

    public void MakeRefund (PaypalPaymentInfo orderInfo)
    {
      ...
    }
}

因为 PaypalPaymentInfo 可以在指定 OrderInfo 的任何地方使用,所以这是 IPayment 的有效实现。您可以对信用卡和 Google 支付实现采用相同的模式。

关于c# - 接口(interface)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201691/

相关文章:

JAVA:如何在二进制文件中正确存储对象?不覆盖

java - 可克隆接口(interface)的意义何在?

java - 接口(interface)引用变量有哪些属性?为什么以下代码/片段失败?

c# - Restsharp 与 Restsharp.net2 之间有什么区别

oop - 在 R 中使用 callNextMethod() 传递参数的问题

c++ - 全局对象是否提供比多个本地实例更好的性能?

c - 如何在不停止 C 程序的情况下按下最后一个键?

javascript - Json.Parse 转义换行符

c# - 使用 C# 在 pc 上实现控制面板的功能

c# - 如何在C#中检查LiteDB数据库文件是否有密码?