继承需要谨慎使用,继承使用的场景是以父类为核心,子类是父类某个特性方法的实现。比如
abstract class Payment{
public void payGoods(){
// 计算物资
int value = calcGoods();
// 付钱
pay();
}
abstract int pay(int value);
}
class RMBPayment extends Payment{
@Override
int pay(int value){
return value * 7;
}
}
class USDPayment extends Payment{
@Override
int pay(int value){
return value * 1;
}
}
如上,类的核心依然在于Payment的payGoods方法,而子类实现只是针对不同货币的实现。
而如果实际使用的核心是子类,父类的方法只是作为共用内容,这种场景应该使用组合而不是继承,如下:
class Worker{
void init();
}
class CarWorker extends Worker{
void packCar(){
init();
doPackCar();
}
}
class ComputerWorker extends Worker{
void packComputer(){
init();
doPackComputer();
}
}
如上,这种情况下,类的核心在于子类,应该讲Worker和下面两个类进行组合而不是继承。