簡體   English   中英

C#,使用接口

[英]C#, Using Interface

我正在嘗試使用Interface類,我對Interface方法參數有疑問。

我有一個Interface類來使子類使用特定的方法。 但是子類需要不同數量的參數。

例,

public interface IPayment
{
  void MakePayment();
}

並在子類中定義MakePayment方法。

public class PayPay : IPayment
{
  public void MakePayment(string a); // it needs only one parameter
}

public class Google : IPayment
{
  public void MakePayment(string a, int b); // it needs two parameters.
}

像上面的情況一樣,我該如何修改我的接口類?

謝謝!

一個干凈的方法可以是簡單地使用PaymentParameters類並使用一個名為public void MakePayment(PaymentParameters params);

更改您的界面以使用PaymentParameters類,該類包含每個不同服務可能需要的所有參數。

public interface IPayment 
{ 
   void MakePayment(PaymentParameters p);   
} 

public class PaymentParameters{
    public string A { get; set; }
    public int B { get; set; }
}

你的GooglePayPay實施將使用只從需要的參數PaymentParameters

那么,接口的原理是不知道實現。 因此,界面的調用者將不知道它是否是PayPay子類的Google並且將始終調用相同的方法。

但是如果你有更復雜的參數,你應該使用IPaymentParameters和一個方法與這個原型

public interface IPayment
{
     void MakePayment(IPaymentParameters parameters);
}

並實現了兩個GooglePayementParametersPayPayPaymentParameters

您的PayPayGoogle課程是否代表描述付款所需的數據? 通常,付款類應代表付款。 如果班級的工作是處理付款,它應該有一個像PaymentProcessor這樣的名稱,其接口類似於IPaymentProcessor (或者甚至是IPaymentService ,或者類似的東西)。

如果支付類代表實際支付,那么該類不應該需要MakePayment()方法的任何參數; 相反,它將依賴實例數據來描述正在進行的付款。

或者,您可能會有這樣的事情(仍使用Payment來描述付款本身):

interface IPaymentProcessor<T> where T : IPayment
{
    void ProcessPayment(T payment);
}
class PayPayPaymentProcessor : IPaymentProcessor<PayPay>
{
    void ProcessPayment(PayPay payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<Google>
{
    void ProcessPayment(Google payment) { /* some implementation here */ }
}

我可能會將課程命名為PayPayPaymentGooglePayment因此名稱更清楚地表示類型:

class PayPayPaymentProcessor : IPaymentProcessor<PayPayPayment>
{
    void ProcessPayment(PayPayPayment payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<GooglePayment>
{
    void ProcessPayment(GooglePayment payment) { /* some implementation here */ }
}

請注意,這與其他建議使用PaymentParameters類的方法非常相似,但它更貼近單一責任原則。 在布萊恩Cauthon的回答, PaymentParameters類必須適用於任何類型的支付的所有可能的參數的結合; 在這里,參數類型可以(並且應該)特定於它們所代表的付款需求。

您可以定義兩個接口,也可以使用以下接口;

public interface IPayment
{
    void MakePayment(string a, int b=0);
}

當您只傳遞字符串參數時,該方法將b設置為0; 你可以忽略它。

如果使用.NET 4.0,則可以使用Interface-Method默認值

public interface ITest{
void Function(stirng s1, string s2 = "");
}

直接來自MSDN -

接口僅包含方法,委托或事件的簽名

方法的簽名包括方法的名稱以及每個形式參數的類型和種類(值,引用或輸出),按從左到右的順序考慮

如果您沒有提供方法的實現(包括每個參數的類型和類型),那么您還沒有真正“實現”接口。

祝好運! :)

狹谷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM