继承需要谨慎使用,继承使用的场景是以父类为核心,子类是父类某个特性方法的实现。比如

    1. abstract class Payment{
    2. public void payGoods(){
    3. // 计算物资
    4. int value = calcGoods();
    5. // 付钱
    6. pay();
    7. }
    8. abstract int pay(int value);
    9. }
    10. class RMBPayment extends Payment{
    11. @Override
    12. int pay(int value){
    13. return value * 7;
    14. }
    15. }
    16. class USDPayment extends Payment{
    17. @Override
    18. int pay(int value){
    19. return value * 1;
    20. }
    21. }

    如上,类的核心依然在于Payment的payGoods方法,而子类实现只是针对不同货币的实现。
    而如果实际使用的核心是子类,父类的方法只是作为共用内容,这种场景应该使用组合而不是继承,如下:

    1. class Worker{
    2. void init();
    3. }
    4. class CarWorker extends Worker{
    5. void packCar(){
    6. init();
    7. doPackCar();
    8. }
    9. }
    10. class ComputerWorker extends Worker{
    11. void packComputer(){
    12. init();
    13. doPackComputer();
    14. }
    15. }

    如上,这种情况下,类的核心在于子类,应该讲Worker和下面两个类进行组合而不是继承。