对于重写和多态的一个练习回顾

 

设计一个员工系统:

           员工分为:Sells销售人员(编号/姓名/工资/提成);Admin管理人员(编号/姓名/工资/职务);Tech技术人员(编号,姓名,工资,显目组);Department行政人员(编号,姓名,工资)。

          有两种行为:1计算年收入;2招聘员工。

对于这个题目的分析:

          首先写一个员工类,把员工共同的属性和方法放在员工类中。

          写Sells,Admin,Tech,Department四个员工的子类,由于这四个子类各有自己不同的属性和方法,需要写一下,相同的方法,和属性,可以从父类那里继承而来。

          还需要一个测试类。用main方法来测试缩写的程序是否正确。

          通过读题目,我们发现有一个类比较特殊,那就是销售人员,因为在计算其工资的时候,还需要考虑到提成的问题。对于其他所以人员,其工作的计算方式是相同的,只有销售人员的工资计算是不一样的。很显然,我们可以用继承来搞定,这里也告诉我们销售人员继承过来是不合适的,因此用到了重写。这很符合继承和重写这两种技术结合的条件。所以计算年薪的方法就这样搞定了。

         由于计算年薪是所以的员工都要计算,所以直接把计算员工的工资的方法写在了员工类中,由于销售人员继承员工类,期中计算工资的方法是不合适的,需要重写一下。这样就搞定了计算工资的方法。

这里还需要提到了一点就是,在子类里写全参构造的时候,要把其所有的属性都写上,(由于子类里的所以属性不一定都是在子类里申明的,部分可能是在父类中就申明了,写全参构造的时候,这部分属性也要写在子类的全参的构造中,这样才算是真正的全参的构造)。

public class Emp {
	private String id;
	private String name;
	private double sal;
	
	
	public Emp() {
		super();
	}
	
	public Emp(String id, String name, double sal) {
		super();
		this.id = id;
		this.name = name;
		this.sal = sal;
	}
	public double comIncome(){
		return sal*12;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getSal() {
		return sal;
	}
	public void setSal(double sal) {
		if(sal >= 800){
			this.sal = sal;
		}
		else{
			System.out.println("非法工资");
		}
	}
	
}
public class Sells extends Emp{
	private double d = 0.1;

	public Sells() {
		super();
		
	}
    //下面才是全参数构造
	public Sells(String id, String name, double sal,double d) {
		super(id, name, sal);
		this.setD(d);
		
	}
        public double comIncome(){           //重写的思想应用到了这里了
    	        return getSal()*(1+d)*12;
        }
	public double getD() {
		return d;
	}

	public void setD(double d) {
		if(d>=0&&d<=1.0){
			this.d = d;
		}
		else{
			System.out.println("提成无效");
		}
	}

}
public class Admin extends Emp {
	private String pos;

	public Admin() {
		super();
		
	}

	public Admin(String id, String name, double sal,String pos) {
		super(id, name, sal);
		this.setPos(pos);
		
	}

	public String getPos() {
		return pos;
	}

	public void setPos(String pos) {
		this.pos = pos;
	}
	

}
public class Tech extends Emp{
	private String project;

	public Tech() {
		super();
		
	}

	public Tech(String id, String name, double sal,String project) {
		super(id, name, sal);
		this.setProject(project);	
	}
	public String getProject() {
		return project;
	}

	public void setProject(String project) {
		this.project = project;
	}
	

}
public class Department extends Emp{

	public Department() {
		super();
	}

	public Department(String id, String name, double sal) {
		super(id, name, sal);
	}

}

public class Test {//开发的时候的开闭原则     不要修改     可以扩展
	public double getIncome(Emp e){
		
		return e.comIncome();         //重写+多态
	}
	public void addEmp(Emp e){
		System.out.println("招聘了员工"+e.getName());
	}
	public static void main(String[] args){
		
		Test t = new Test();
		Emp e1 = new Emp("007","帮得",3000);
		System.out.println(t.getIncome(e1));
		Emp e2 = new Admin("009","大内密探",5000,"泡公主");
		System.out.println(t.getIncome(e2));
		Emp e3 = new Sells("001","大力丸",3000,0.5);
		System.out.println(t.getIncome(e3));

	}
}

在这里要感谢张立猛老师,这些都是我在远程班上课学到的东西,拿出来整理一下,加深印象和巩固,也希望能给其他人一些启发。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值