2012-11-28 197 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(); 
}