2012-11-28 153 views
1

需要一些OOP幫助。覆蓋繼承中的空方法

我有一個基本付款,包括SendPayment() UpdateRecord(),然後子類實現不同的付款格式,例如PayPal,SagePay。

雖然全部都有SendPayment()方法,但它們都以不同的方式實現。所以我重寫基類以在每個子類中應用我自己的實現。基類不包含任何實現只是空方法。這是一個OOP的好方法,讓空方法然後在每個子類中實現重寫代碼,或者刪除基類中的空方法並在子類中使用這些方法?

感謝...

對不起快速編輯。我在某些場景中使用基類來進行計算。這涵蓋了所有支付類型,例如按成本計算多少產品並從表中移除記錄。

+0

如果你不無需實例化基類,我會將您的基類設置爲抽象,並且對於您的空方法也是如此。這允許你定義一個空方法並強制你在派生類中覆蓋它 – Ondra

回答

3

我建議讓你的基類成爲abstract類,並使未實現的方法成爲abstract方法。

public abstract class BasePayment { 

     //abstract method: unimplemented   
     public abstract void sendPayment(); 

     //implemented method  
     public void UpdateRecord(){ 
      ..... 
     } 

    } 

Abstract類是爲這樣的,你想擁有執行和未執行的方法的組合方案。這裏增加的一個好處是:每個擴展課程將被迫執行它自己的sendPayment方法。

+0

抽象,或甚至一個接口(如果根本沒有代碼)是OOP的路要走 –

+0

@SteveB同意​​。我相信OP只希望'sendPayment'有所不同,因此認爲'abstract'類是更好的選擇。 –

+0

感謝您的幫助。我認爲抽象是正確的方式,因爲我混合搭配。你是對的SteveB我犯了一個錯誤,只有付款方式不同。所有的方法都是共享的,但是基類有其他的實現,不在子類中使用。 –

2

如果您的子類在沒有重寫基本方法的情況下沒有意義,請保留基本方法abstract

但如果基類中只包含抽象方法,並且沒有任何狀態(這是你的情況我猜)是更好的使用界面,因爲界面休假實施者權有另一個基類

0

它好。但這取決於你將如何使用基類。你可以標記方法或類abstract,在這種情況下,所有的子類必須執行它們。如果您將它們標記爲virtual,則子類可能會在需要時覆蓋它們或保留爲空。
如果您沒有在基類中指定方法,您將無法使用抽象和多態性及其所有的功能。例如,如果您有付款(List<Payment>)的列表(不要緊,實際付款類型),你要發送所有的人,你將無法下一步:

foreach(Payment payment in payments) 
{ 
    payment.SendPayment(); 
}