[英]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; }
}
你的Google
和PayPay
實施將使用只從需要的參數PaymentParameters
。
那么,接口的原理是不知道實現。 因此,界面的調用者將不知道它是否是PayPay
子類的Google
並且將始終調用相同的方法。
但是如果你有更復雜的參數,你應該使用IPaymentParameters
和一個方法與這個原型
public interface IPayment
{
void MakePayment(IPaymentParameters parameters);
}
並實現了兩個GooglePayementParameters
和PayPayPaymentParameters
您的PayPay
和Google
課程是否代表描述付款所需的數據? 通常,付款類應代表付款。 如果班級的工作是處理付款,它應該有一個像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 */ }
}
我可能會將課程命名為PayPayPayment
和GooglePayment
因此名稱更清楚地表示類型:
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.