1. 程式人生 > >Java語言的多型機制實現

Java語言的多型機制實現

多型與動態繫結機制,在實踐中非常常見,適用於許多場景,尤其是對於設計複雜的測試用例,更能發揮強大的作用。

先實現一個demo,把思路走通再說。

/**
 * 
 */
package ball;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * @author administrator
 *
 */
public class BallTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BallTest ball = new BallTest();
		ball.testMethod();
	}

	private void testMethod() {
		
		// 初始化
		BallPlay ballPlay = null;
		
		System.out.println("提示:1是乒乓球賽,2是足球賽,3是羽毛球賽,4是檯球賽!");
		
		Scanner scanner = new Scanner(System.in);
		int vChoice = 0;
		
		for (int i = 0; i < 3; i++) {
			try {
				System.out.print("現在看哪個比賽:");
				vChoice = scanner.nextInt();				// 程式執行時,才能知道具體的例項和方法呼叫,而不是在編譯時確定
				switch (vChoice) {
				case 1:
					ballPlay = new PingPangBall();
					ballPlay.playStarting("乒乓球賽");
					break;
				case 2:
					ballPlay = new FootBall();				// 子類可以自動向父類轉換
					((FootBall) ballPlay).lookGiftBox();	// 父類向子類轉換必須進行強制轉換,當然這種轉換是安全的
					ballPlay.playStarting("足球賽");
					break;
				case 3:
					ballPlay = new Badminton();
					ballPlay.playStarting("羽毛球賽");
					break;
				case 4:
					ballPlay = new BilliardBall();
					ballPlay.playStarting("檯球賽");
					break;
				default:
					throw new InputMismatchException("輸入錯誤!");	
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				// System.out.println("您的輸入非法!");
			} finally {
				ballPlay = null;
				System.out.println("第" + (i + 1) + "場賽事已經結束!");
			}
		}
		
		scanner.close();
		System.out.println("好了,回家吧!");
		
	}
}

class BallPlay {
	public BallPlay() {
		System.out.print("球賽-->");
	}
	
	public void playStarting(String strPlayName) {
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			System.out.println("賽場出事故了," + strPlayName + "賽事提前結束!");
		}
	}
}

class PingPangBall extends BallPlay {
	public PingPangBall() {
		System.out.println("乒乓球賽正在直播。。。");
	}
	
	public void playStarting(String strPlayName) {
		super.playStarting(strPlayName);
	}
}

class FootBall extends BallPlay {
	public FootBall() {
		System.out.println("足球賽正在直播。。。");
	}
	
	public void playStarting(String strPlayName) {
		super.playStarting(strPlayName);
	}
	
	public void lookGiftBox() {
		System.out.println("足球賽場大,送你一臺望遠鏡!");
	}
}

class Badminton extends BallPlay {
	public Badminton() {
		System.out.println("羽毛球賽正在直播。。。");
	}
	
	public void playStarting(String strPlayName) {
		super.playStarting(strPlayName);
	}
}

class BilliardBall extends BallPlay {
	public BilliardBall() {
		System.out.println("檯球賽正在直播。。。");
	}
	
	public void playStarting(String strPlayName) {
		super.playStarting(strPlayName);
	}
}

現在的應用場景是:需要對若干個檔案進行封裝打包,然後提交給伺服器。但是不能的業務需求決定了打包封裝的形勢和資料格式是有點差別的。那麼好了,讓我們先設計一個基類作為封裝類,然後再設計若干個業務類,從這個封裝類繼承下來,緊接著是業務執行單元,在這裡就是BallTest了,在業務執行單元,程式執行時,動態決定到底走哪個業務分支。

執行結果示例: