对于重写和多态的一个练习回顾
2011-12-31 09:44
357 查看
设计一个员工系统:
员工分为:Sells销售人员(编号/姓名/工资/提成);Admin管理人员(编号/姓名/工资/职务);Tech技术人员(编号,姓名,工资,显目组);Department行政人员(编号,姓名,工资)。
有两种行为:1计算年收入;2招聘员工。
对于这个题目的分析:
首先写一个员工类,把员工共同的属性和方法放在员工类中。
写Sells,Admin,Tech,Department四个员工的子类,由于这四个子类各有自己不同的属性和方法,需要写一下,相同的方法,和属性,可以从父类那里继承而来。
还需要一个测试类。用main方法来测试缩写的程序是否正确。
通过读题目,我们发现有一个类比较特殊,那就是销售人员,因为在计算其工资的时候,还需要考虑到提成的问题。对于其他所以人员,其工作的计算方式是相同的,只有销售人员的工资计算是不一样的。很显然,我们可以用继承来搞定,这里也告诉我们销售人员继承过来是不合适的,因此用到了重写。这很符合继承和重写这两种技术结合的条件。所以计算年薪的方法就这样搞定了。
由于计算年薪是所以的员工都要计算,所以直接把计算员工的工资的方法写在了员工类中,由于销售人员继承员工类,期中计算工资的方法是不合适的,需要重写一下。这样就搞定了计算工资的方法。
这里还需要提到了一点就是,在子类里写全参构造的时候,要把其所有的属性都写上,(由于子类里的所以属性不一定都是在子类里申明的,部分可能是在父类中就申明了,写全参构造的时候,这部分属性也要写在子类的全参的构造中,这样才算是真正的全参的构造)。
在这里要感谢张立猛老师,这些都是我在远程班上课学到的东西,拿出来整理一下,加深印象和巩固,也希望能给其他人一些启发。
员工分为: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)); } }
在这里要感谢张立猛老师,这些都是我在远程班上课学到的东西,拿出来整理一下,加深印象和巩固,也希望能给其他人一些启发。
相关文章推荐
- 实现一个自定义字符串的排序 ,重写Comparable接口的练习!!
- JS基础回顾,小练习(获取一个对象里面第一层元素的数量)
- 练习2-9 在求对二的补码时,表达式 x &= (x - 1) 可以删除 x 中最右边值为 1 的一个二进制位,请解释这样做的道理。用这一方法重写biecount函数,以加快其执行速度。
- php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;
- 练习 2-9 在求对二的补码时,表达式x &= (x – 1)可以删除x中最右边值为1的一个二进制位。请解释这样做的道理。用这一方法重写bitcount函数,以加快其执行速度。
- 对于网站跳转到令一个网站的问题?
- java:java中一个最简单的事件练习,…
- 重写、多态
- 一个重写equals()和hashCode()方法的例子
- 对于一个数组{1,2,3}它的子数组有{1,2},{1,3}{2,3},{1,2,3},元素之间可以不是连续的,对于数组{5,9,1,7,2,6,3,8,10,4},升序子序列有多少个?
- 重写、覆盖、重载、多态几个概念的区别分析
- 一个独立程序员对自己近九个月工作生活的回顾
- 在WM_COMMAND中,lParam用来区分是命令消息还是控件通知消息:如果lParam为NULL,则这是个命令消息,否则lParam里面放的必然就是控件的句柄,是一个控件通知消息。对于wParam则是低位放的是控件ID,高位放的是相应的消息事件。
- 第八周 上机练习 设计一个系统,用于赛车上的计算机系统
- java中组合的应用(不相干的类共同完成一个功能)+构造器回顾
- ASPNET服务端控件练习(一个机试题)
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右),某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- Java IO 练习1——创建一个文件
- 回顾一个面试题
- 对于一个小白来说,遇到的前端问题(2)