多态

来源:互联网 发布:智能语音聊天软件 编辑:程序博客网 时间:2024/06/08 01:05

在Java中的多态机制等效于switch逻辑,即允许不同类的对象对同一消息作出响应。

使用多态编程可以避免由switch逻辑带来的常见错误。它包含较少的分支逻辑,倾向于更简化的顺序代码,改善了测试,调试和程序维护。

example:

/**  *  Employee class *//** * @author Administrator * */public abstract class Employee {private String firstName;private String lastName;// Constructorpublic Employee( String first, String last ){firstName = new String( first );lastName = new String ( last );}// Get first namepublic String getFirstName(){return firstName;}// Get last namepublic String getLastName(){return lastName;}// Abstract method earningsabstract double earnings();}

/** *  Boss class *//** * @author Administrator * */public final class Boss extends Employee{private double weeklySalary;// Constructorpublic Boss( String first, String last, double s ){super( first, last );setWeeklySalary( s );}// Set the Boss's salary public void setWeeklySalary( double s ){weeklySalary = ( s > 0 ? s : 0 );}// Get the Boss's paypublic double earnings(){return weeklySalary;}// Print the Boss's namepublic String toString(){return "Boss: " + getFirstName() + " " + getLastName();}}


/** *  Piece worker class definition *//** * @author Administrator * */public final class PieceWorker extends Employee{private int quantity;private double wagePerPiece;// Constructorpublic PieceWorker( String first, String last, double w, int q ){super( first, last );setWagePerPiece( w );setQuantity( q );}// Set wage for each piece of workpublic void setWagePerPiece( double w ){wagePerPiece = ( w > 0 ? w : 0 );;}// Set worker's quantitypublic void setQuantity( int q ){quantity = ( q > 0 ? q : 0 );;}// Set PieceWorker's paypublic double earnings(){return wagePerPiece * quantity;}// Print worker's namepublic String toString(){return "PieceWorker: " + getFirstName() + " " + getLastName();}}


/** * CommissionWorker class *//** * @author Administrator * */public class CommissionWorker extends Employee{private double salary;private double commissions;private int quantity;// Constructorpublic CommissionWorker( String first, String last, double s, double c, int q ){super( first, last );setSalary( s );setCommissions( c );setQuantity( q );}// Set Commission worker's salarypublic void setSalary( double s ){salary = ( s > 0 ? s : 0 );}// Set worker's commissionspublic void setCommissions( double c ){commissions = ( c > 0 ? c : 0 );}// Set quantitypublic void setQuantity( int q ){quantity = ( q > 0 ? q : 0 );}// Get the worker's paypublic double earnings(){return salary + commissions * quantity;}// Print the worker's namepublic String toString(){return "Commission worker: " + getFirstName() + " " + getLastName();}}

/** *  Hourly worker class definition *//** * @author Administrator * */public final class HourlyWorker extends Employee{private int hour;private double wagePerHour;// Constructorpublic HourlyWorker( String first, String last, double w, int h ){super( first, last );setWagePerHour( w );setHour( h );}// Set wage for each piece of workpublic void setWagePerHour( double w ){wagePerHour = ( w > 0 ? w : 0 );}// Set worker's quantitypublic void setHour( int h ){hour = ( h > 0 ? h : 0 );}// Set PieceWorker's paypublic double earnings(){return wagePerHour * hour;}// Print worker's namepublic String toString(){return "HourlyWorker: " + getFirstName() + " " + getLastName();}}

import java.applet.Applet;import java.awt.Graphics;/** *  Test program *//** * @author Administrator * */public class Test extends Applet{private Employee emp;private Boss b;private CommissionWorker c;private PieceWorker p;private HourlyWorker h;public void init(){b = new Boss( "John", "Smith", 800.00 );c = new CommissionWorker( "Sue", "Jones", 400.0, 3.0, 150 );p = new PieceWorker( "Bob", "Lewis", 2.5, 200 );h = new HourlyWorker( "Karen", "Price", 13.75, 40 );}public void paint( Graphics g ){emp = b;g.drawString( emp.toString() + " earned $" + emp.earnings(), 75, 75 );g.drawString( b.toString() + " earned $" + b.earnings(), 75, 90 );emp = c;g.drawString( emp.toString() + " earned $" + emp.earnings(), 75, 120);g.drawString( c.toString() + " earned $" + c.earnings(), 75, 135 );emp = p;g.drawString( emp.toString() + " earned $" + emp.earnings(), 75, 165);g.drawString( p.toString() + " earned $" + p.earnings(), 75, 180 );emp = h;g.drawString( emp.toString() + " earned $" + emp.earnings(), 75, 210);g.drawString( h.toString() + " earned $" + h.earnings(), 75, 225 );}}


原创粉丝点击