我不太清楚如何使用接口(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/