2012-04-18 49 views
2

我想使用接口類,我有一個關於接口方法參數的問題。C#,使用接口

我有一個接口類,使子類使用特定的方法。 但子類需要不同數量的參數。

實施例,

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

像上述情況下,如何修改我的接口類?

謝謝!

+2

的界面和接口的所有實現需要具有相同的簽名(意味着相同的參數列表)。這真的沒有辦法。 – Servy 2012-04-18 14:18:21

+2

潛在誘惑; http://stackoverflow.com/questions/6114519/how-to-create-method-interface-with-variable-parameters-different-method-signa – dash 2012-04-18 14:18:44

+0

除了「接口類」是矛盾的; 「接口類型」或只是「接口」會更好。 – phoog 2012-04-18 14:23:42

回答

7

更改界面使用包含全部PaymentParameters類每個不同服務可能需要的參數。

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

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

GooglePayPay實現將只使用從PaymentParameters所需要的參數。

從MSDN
+0

-_-'從未想過這個解決方案。 – 2012-04-18 14:47:00

+0

@FrancisP偉大的思想都相似? :)當我打字時,我從來沒有收到任何「加載新答案」通知。爲了它的價值,我確實鼓舞了你。 – 2012-04-18 15:03:20

+0

哈哈我不介意布賴恩,它發生! – 2012-04-18 15:09:33

8

甲清潔方法可以是簡單地使用一個PaymentParameters類,並使用稱爲public void MakePayment(PaymentParameters params);

+1

我不會說那麼幹淨,完全相反。該參數類基本上需要知道實現「IPayment」的所有類,以爲每個實現提供有意義的值。 – 2012-04-18 14:20:27

+1

您可以爲每個支付類別進行分類,然後每個支付類將不得不檢查它是否符合預期。你也可以通過在界面上創建一個'創建一個參數類'的方法來實現這一點,前提是你可以根據它的屬性動態填充它。通過你的網絡框架。但是我不確定我是否喜歡這樣。 – Rup 2012-04-18 14:22:36

+0

那麼默認值可以由這個類定義。此外,該方法在將來變得高度可維護。 – 2012-04-18 14:23:13

3

您可以定義兩個接口,或使用下面的一個方法;

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

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

1

如果您使用.NET 4.0比你可以給你的界面法默認值

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

好,接口的聖多美和普林西比是不知道的實現。因此,接口的調用者將不知道它是否是PayPay子類的Google,並且將始終調用相同的方法。

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

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

和兩個實現GooglePayementParametersPayPayPaymentParameters

+1

問題在於,調用者需要始終傳遞正確的支付參數,這意味着他們需要知道哪個類正在實現接口,這違背了使用接口的目的。 – Servy 2012-04-18 14:26:44

+1

好吧,這取決於你是否使用注入和誰實例化誰......這是一個更復雜的情況,應該解決設計的大圖。 – 2012-04-18 14:52:32

0

直 -

接口只包含簽名的方法,委託或事件

方法的簽名由方法和的名字每一個形參,在順序考慮的類型和種類(值,參考,或輸出)左至右

如果不提供的方法(包括每個參數的類型和種類)的實現,那麼你就沒有真正「實現」的接口。

祝你好運! :)

格倫

4

做你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 */ } 
} 

請注意,這與其他建議使用類的方法非常類似,但它更貼近單責任原則。在Brian Cauthon的回答中,PaymentParameters課程必須爲任何類型的付款保留所有可能參數的聯合;在這裏,參數類型可以(也應該)特定於它們所代表的支付需求。