1. 程式人生 > >通過一個“印表機”例子來更好的理解什麼是多型。

通過一個“印表機”例子來更好的理解什麼是多型。

/**
 * Machine類代表一臺印表機。這臺印表機裡面分別裝有墨盒(BoxDemo類),紙張(PaperDemo類)
 * 這個Machine類(印表機)的構造方法是傳遞兩個引數,分別是墨盒(BoxDemo類),紙張(PaperDemo類)。
 * 墨盒(Box類)也有兩個子類,彩色墨盒(ColorBox)和黑白墨盒(BlackBox);
 * 紙張(Paper類)也有兩個子類,A4紙張類和B5紙張類。
 * Machine類的構造方法不傳遞具體實現的哪個墨盒或哪一種紙張,只是傳遞他們的父類有墨盒(BoxDemo類),紙張(PaperDemo類)。
 * 然後通過父類引用指向子類的物件實現多型。
 * 
 */
public class Machine { //私有化墨盒BoxDemo抽象類和紙張PaperDemo抽象類作為成員變數。 //雖然抽象類不可以建立具體的例項物件,但可以宣告,通過父類的引用指向子類的物件來實現多型。 //這裡存在繼承、子類重寫父類的方法、父類的引用指向子類的物件,,,是實現多型的三個必要條件。 private BoxDemo boxDemo; private PaperDemo paperDemo; public Machine() { super(); // TODO Auto-generated constructor stub
} public Machine(BoxDemo boxDemo, PaperDemo paperDemo) { super(); this.boxDemo = boxDemo; this.paperDemo = paperDemo; } //留一個公開的startPrint()方法給其他類呼叫。 public void startPrint(){ System.out.println("正在使用" + boxDemo.boxPrint() + paperDemo.paperPrint()); } public
BoxDemo getBoxDemo() { return boxDemo; } public void setBoxDemo(BoxDemo boxDemo) { this.boxDemo = boxDemo; } public PaperDemo getPaperDemo() { return paperDemo; } public void setPaperDemo(PaperDemo paperDemo) { this.paperDemo = paperDemo; } }

/**
 * 這個是代表墨盒的父類BoxDemo類,它是一個抽象類,具體方法由繼承它的子類來重寫實現。
 *
 */
public abstract  class BoxDemo {
    //這裡是一個抽象類,具體的方法由子類實現;
    public abstract String boxPrint();
}

/**
 * 這個是代表“紙張”的父類PaperDemo類,它是一個抽象類,具體方法由繼承它的子類來重寫實現。
 *
 */
public abstract class PaperDemo {
    public abstract String paperPrint();

}

/**
 *這個是“紙張PaperDemo”的子類,並重寫了父類的方法。
 *
 */
public class A4 extends PaperDemo{
    @Override
    public String paperPrint() {
        return "A4";
    }
}


-------------------------------------------------------------
/**
 *這個是“紙張PaperDemo”的子類,並重寫了父類的方法。
 *
 */
public class B5 extends PaperDemo{
    @Override
    public String paperPrint() {
        return "B5";
    }
}


/**
 *這個是“墨盒BoxDemo類”的子類,並重寫了父類的方法。
 *
 */
public class BlackBox extends BoxDemo{
    @Override
    public String boxPrint() {
        return "黑白墨盒";
    }
}


------------------------------------------------------------------
/**
 *這個是“墨盒BoxDemo類”的子類,並重寫了父類的方法。
 *
 */
public class ColorBox extends BoxDemo{
    @Override
    public String boxPrint() {
        return "彩色墨盒";
    }
}


/**
 * 這個是執行測試類Lanuch,來看看是怎樣實現多型的。
 *
 */
public class Lanuch {
    public static void main(String[] args) {
        //分別建立BoxDemo和PaperDemo的子類,當作引數傳遞給Machine類的構造方法。
        A4 a4 = new A4();
        B5 b5 = new B5();
        BlackBox blackBox = new BlackBox();
        ColorBox colorBox = new ColorBox();
        //分別建立4臺不同的印表機。
        Machine machine01 = new Machine(colorBox, a4);
        Machine machine02 = new Machine(blackBox, a4);
        Machine machine03 = new Machine(colorBox, b5);
        Machine machine04 = new Machine(blackBox, b5);
        //呼叫印表機的列印方法。
        machine01.startPrint();
        machine02.startPrint();
        machine03.startPrint();
        machine04.startPrint();
    }
}