不良程式碼展示-父類中可以抽象出子類的行為
阿新 • • 發佈:2019-01-28
把一段程式碼,業務邏輯剝離後,給大家看看。
基類:
package testjava; /** * 書的基類 */ public class BaseBook { private int type = -1; public BaseBook(int type) { this.type = type; } /** * 列印頁面 */ public void printPage() { if (type == 1) { System.out.println("Print with the green color."); } else if (type == 2) { System.out.println("Print with the blue color."); } else { System.out.println("Print with the white color."); } } }
子類1:
package testjava;
/**
* 綠色的書
*/
public class GreenBook extends BaseBook {
public GreenBook(int type) {
super(type);
}
/**
* 得到顏色
* @return 顏色
*/
public String getColor() {
return "Green";
}
}
子類2:
package testjava; /** * 藍色的書 */ public class BlueBook extends BaseBook { public BlueBook(int type) { super(type); } /** * 得到顏色 * @return 顏色 */ public String getColor() { return "Blue"; } }
呼叫的類:
package testjava; /** * 執行類 */ public class Testjava { /** * @param args the command line arguments */ public static void main(String[] args) { BlueBook bb = new BlueBook(2); bb.printPage(); GreenBook gb = new GreenBook(1); gb.printPage(); } }
執行結果當然是對的。可是,子類的行為,卻定義在了父類之中了。也就是說,基類的“書”,卻根據每本書的顏色去做行為判斷的。
if (type == 1) {
System.out.println("Print with the green color.");
} else if (type == 2) {
System.out.println("Print with the blue color.");
} else {
System.out.println("Print with the white color.");
}
這個結構,擴充套件性不好,也不好維護,也不好閱讀。
問當事人,當事人說,我在父類沒法知道是哪個子類啊。但是這個業務是可以抽取的,所以就寫成這個樣子了。
其實,可以這麼寫的。
基類:
package testjava.right;
/**
* 書的基類
*/
public abstract class BaseBook {
public abstract String getColor();
/**
* 列印頁面
*/
public void printPage() {
System.out.println("Print with the " + getColor() + " color.");
}
}
子類1:
package testjava.right;
/**
* 藍色的書
*/
public class BlueBook extends BaseBook {
/**
* 得到顏色
* @return 顏色
*/
public String getColor() {
return "Blue";
}
}
子類2:
package testjava.right;
/**
* 綠色的書
*/
public class GreenBook extends BaseBook {
/**
* 得到顏色
* @return 顏色
*/
public String getColor() {
return "Green";
}
}
執行類:
package testjava.right;
/**
* 執行類
*/
public class Testjava {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
BlueBook bb = new BlueBook();
bb.printPage();
GreenBook gb = new GreenBook();
gb.printPage();
}
}
把屬於子類的行為,定義成抽象函式,由子類去實現。OK