我不清楚使用接口类清楚.我阅读了很多关于接口类相关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类.有人知道我该怎么办呢?
一种方法是创建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付款实施.
实现这一目标的正确方法是为每种类型的付款创建一个类,但将它们用作一般付款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接口,您就不关心执行该方法的类型.