[音乐]
下面我们来看
一个稍微综合一点的这样的一个案例,那么就是我们实现,用多态来实现一个员工工资系统。
那么在这样的一个员工工资系统里面,我们一共有4类员工,其中一个是固定工, 那么每周的工资是一样的,工作时间长短无关。
那么它对应的类是这个 SalariedEmployee 这样的一个类,
还有一个计时工,是按时计酬的,那么还有一个雇员的员工, 那么他怎样呢,是按销售的百分比计酬的。
还有一个底薪雇员员工,是在底薪的基础上怎么样呢,按增加的销售比继承的。
那么这样的一些员工,组成了这样的一个类图关系,所有的基类是 Employee,在 Employee 里面派生出了三个类,
分别是这样的一个固定工,和这样的一个 计时工,以及这样的一个雇佣工,在雇佣工的下面再派生了一个类,
那么他是这样的一个 底薪雇佣员工,底薪雇佣员工。
每一个类的这样的一个计酬的 方式都不一样,都不一样,那么下面我们来实现这样的一个
简单的这样的一个工资系统。
[无声]
[无声]
[无声] [无声]
[无声] 例 27,员工的工资
那么在这样的一个系统 里面,我们首先创建这样的一个,我们首先创建
这样的一个基类,那么这样的一个基类是什么呢,是这样的一个
抽象类。
我们首先创建一个抽象的基类,class Employee
[无声]
在这样的一个抽象的基类里面,在这样的抽象的基类里面,我们提供这样的一个几个属性,
其中一个匿名的属性是这样的一个关于员工的名字,
那么它提供一个 匿名的属性,在这个匿名的属性里面这个
get 方法怎么样呢,是, 是公开的,而这个
存取怎么样呢,是私有的,不能够这样的存取。
那么同时我们在提供一个 员工的这样的一个身份证号,
我们把它叫做一个 SSD 吧,社会识别号。
它也有一个 get。
private set。
[无声] 那么随后我们,随后我们写一下这个
这个类的, 这个类的构造函数,
那么这样的一个类的构造函数,那么它肯定带有这样的一个三个参数,三个参数。
其中一个是员工的名字, 一个是 SSD 这样的一个号码,
那么在这样的三个参数里面,我们分别把这个参数给这个
设置为这个属性的值。
[无声]
随后怎么样呢,随后我们 在这样的一个
在这样的一个类里面我们重载 这个 abstract
类的这样的一个 ToString 这样的一个 方法来显示什么呢,来显示一下员工的这样的一个
名字和他的这样的一个 SS,ID号,
那么也就是说我们 return,返回一个
[无声]
返回一个这样的一个
string.Format
我们通过这样的一个方式返回一个这样的一个它们的这样的一个号,那么这个的显示是就是
这样显示。
员工的这样的一个 名字这样的一个
名字显示在前面,显示在前面,那么
是 ID
号 [无声]
ID 的这样的一个号码怎么样呢,显示在这样的一个后面,
1,ID 号码显示在后面。
名字,ID 号码,
显示在这样的一个后面,那么分别这样的是我们的这个 name
还有这个 SSD, ok。
随后怎么样呢,随后我们再定义一个这样的一个抽象的 显然是一个抽象的类,肯定会含有一个抽象的方法,
abstract 这样的一个抽象的方法,它返回这样的一个小数, 也就是说这个方法计算他的这个工资
所得, 那么在这样的一个方法里面,
我们这个方法是抽象的,那么它只有这样的一个函数的头,没有任何的实践部分。
这是我们写完了这样的我们这个 抽象的基类, Employee。
那么根据我们幻灯片上的那个图,在抽象的基类上面我们首先派生出来一个
派生了一个 固定员工的工资的这样的一个类,
Salaried [无声]
[无声] 然后它是从这个 Employee 这样的一个类派生的。
那么在这样的一个派生类里面,我们
增加了一个私有的变量来表示它这样的一个
每一周的这样的一个工资,每一周的工资。
那么这个工资当然是我们实际在,实际使用这样的
工资系统的时候,需要指定的这样的一个工资,你打算给这样的员工 每一周多少工资。
同时我们给出来一个 给出来一个对应的什么呢,对应的这样的一个属性,能够存取这样的一个值。
我们没有使用匿名属性, 因为我们在存取这个值的时候怎么样呢,我们要
检查一下这个值是否合理,那么首先我们
要给出一个 get,
return 这个小写的这个东西。
以及 set set 那么我们在赋这个值的时候
我们赋这个值的时候我们要检查一下什么,检查一下这个 value
是不是大于,是不是大于等于 0 的,那么他的工资不能为负的。
那么如果是的话那就是 value,否则的话那么就是 0。
否则的话就是 0。
那么完了之后怎么样呢,完了之后我们
给出什么呢,给出这个类的构造函数, 构造函数,
那么在这个构造函数里面,除了它要传递给父类 的两个名字,一个名字之外,
以及一个 SSD 号之外,
[无声] 以及还有自己的这样的一个周工资,
那么它是一个小数, [无声]
我们把它就定义为 week,
S,那么在这样的一个里面, 其中
name 和 SSD 是这样的一个
传递给基类的,传递给基类的。
那么这个 这个周工资是要对自己怎么样呢进行初始化的,初始化的
[无声] 是要进行初始化的
[无声] 我们把这个变量名改一下,这个变量名写得
写得不是太,意义含义 不太明确,我们把它改成工资,这样的含义更加明确一些
好 那么做完了这样的一个
构造函数之后,我们首先先来看一下这个关于最关键的我们这个多肽系统的这个
我们这个多肽系统这个关于这个工资的计算
关于工资的计算,也就是关于这个 earning
这样的一个计算 那么怎么做呢?
首先,那么前面是一个 abstract 的抽象类,那么当然了
我们要实现这样的一个 earning, earning 呢当然了它每一周计的这样的一个工资
跟,跟什么呢?跟什么东西都没有关系,就是怎 么样呢,就是它的这样的一个周工资,所以我们直接 return
这样的一个值就可以了 那么同样的,在最后,在这个类的最后,我们
[无声] public
我们怎么样呢,我们再重载一下这样的一个 ToString 的函数
再重载一下 ToString 的函数,然后用来显示这样的一个
对于这样的一个显示,我们显示一下这个固定员工,那么它的这样的一个 姓名以及它所挣的这样的一个
钱数就可以了 那么所以
我们可以 return 什么呢?return 这样的一个 format 这样的一个函数
return str
string.Format,那么在 format
这个函数里面 我们首先输出一下它是
固定员工的
Employee
那么在这里面我们输出一个 字符串 0
,输出一个字符串 0 那么对应的这样的一个字符串 0
,那么是打印它 这样的一个基本的信息,基本信息我们可以直接调用这样的什么呢?
调用它的这样的一个 基类的这个信息来输出就行了。
那么打印完了信息之后我们为了看的清楚点,我们把它换一行 换一行完了之后怎么样呢?换一行完了之后我们继续,继续打印什么呢?
继续打印它的这样的一个周工资是 多少就行了。
对于这样的一个周工资,我们按照这样的一个 按照这样的一个
货币来进行打印,所以是我们用 1, 然后用这样的一个东西来打印 那么完了之后怎么样呢,完了之后
完了之后第一个 我们怎么样呢,第一个我们调用 base.
这样的一个 ToString 来输出它的这样的一个名字,对于第二个,我们直接怎么样呢?
换一行,写的太长了。
对于 第二个,我们直接输出这样的一个 Salary
就可以了。
OK 好了,那么这时我们就创建了一个固定员工。
我们还有 剩下的三个类要创建,任重道远呐
public class,然后下来我们再来创建这样的一个
按这样的一个
小时,小时工 [无声]
[无声]
[无声] 它也是从这样的一个
Employee 基类怎么样呢,派生出来的,只是按小时计的
那么它的写法怎么样呢,跟,跟刚才的这样的一个 固定员工的这个写法基本上是类似的,所以说我们可以写的快一点
private,我们声明这样的一个按小时 计时的这样的一个工资数,那么假设是
w wage
以及什么呢,以及它这样的一个工作的这样的一个小时数
private,工作小时数也是用一个
小数来,我们精确到小数来计算吧,hours
那么提供了这两个,提供了这样的两个
这样的两个变量了之后,我们再为这样两个变量也创建一个属性
public
[无声]
[无声] [无声]
[无声]
set wage
等于 value 大于等于 0,
value 否则的话,那么是 0。
然后我们同样它有 一个 public
,这个小时数 的属性,分别是
get return
hours set
hours 等于,都是一样,value 大于等于 0 逗号,冒号
value 逗号,不是,应该是冒号
那么创建完了这样的两个属性了之后,那么下来就是它的构造函数了
public HourlyEmployee。
那么在这个构造函数里面很显然 在这里面我们又增加了两个变量,所以说在这样的一个构造函数里面
我们应该带有这样的一个几个参数呢?带有 4
个,一个名字 一个 ssd
号,以及,以及 他的这个周,周工资
他的这样的一个
周工资,小时工资,不是周 h
o u r
以及 他工作的这样的一个小时数
[无声] 写的有点长了。
hourWorked 然后 冒号,
base 那么需要传递给什么呢,传递给这样的
name 以及这个 ssd 是传递给什么呢,基类的
那么剩下的两个是给自己的,是给自己的,也就是说我们的这个 Wage
应该等于 hoursWage, hourlyWage
以及我们的这个工作的时间,工作时间应该等于什么呢? 我们的这个工作时间。
这是我们完成了,这种构造函数完成了初始化 那构造函数完成了初始化了之后,我们还有一个
需要重载的 public 的这样的一个
override,我们重载的 这样的一个工资的计算方法,工资的计算方法
那么在这样的一个工资的计算方法里面,我们删掉这个系统帮我们生成的
这个东西,那么 iii 方法是这样写的
if,我们计算的规则,我们的 计算规则是,我们的计算规则是什么呢?
我们的计算规则是,是是是是是是 是
if 如果什么呢?如果这个工作的这样的一个工作的时间
如果这个工作的时间要小于等于 40 的话 要小于等于 40 的话,那么
它就应该等于什么?它就应该等于 每小时的这个工资数乘上你的这个工作的时间
否则的话怎么样呢,否则的话,如果这个时间数比较长的话 那么工作时间超过
4 个小时我们要适当的 给他增加一些工资
那么它返回的值就应该是什么呢?就应该是 40
乘上一个 40 小时之内还按原来的这个工资来算,然后再加上一个
每超出的这样的一个部分iii,每超出的部分怎么样?要按 1.
5 倍来算 [无声]
那么这是这样的一个小时工的工资的计法
[无声]
那么出现了一个错误的提示,我们改正一下,那么 这个 1.
5 我默认是一个 double,它没有办法跟 decimal 直接运算,所以我们说得把 这个 1.
5 申明为什么呢?后面加一个后缀 M 表示它是一个 decimal 的数字。
好了 最后,最后我们仍然是
public override,我们
仍然是承载这个 ToString 这样的一个函数,我们重新输出我们自己的这个 ToString
它 return 应该是 string Format
在 Format 里面,我们先输出一下我们的这个
Hou iii
eployee 这样的一个员工
我们在这样的一个员工里面,它的写法跟我们刚才基本上是一样的 在这样的一个员工里面,我们先输出了一下他的这个名字姓名号
最后我们换了一个行,换行完了之后,我们整个输出它的这样的一个
这样它的这样的一个每小时的工资数
以及它的这样的一个工资 [无声]
然后接着是 [无声]
Wage
以及以及工作的时间
[无声] [无声]
[无声]
工作的时间,然后作为第二个参数来进行输出,来进行输出
需要 增加一个,因为换行了,那么需要增加一个这个东西
return 加起来
然后逗号,逗号,第一个是我们通过这个 base .ToString 来完成的。
第二个就直接输的应该是 Wage,第三个数要输的就应该是
Hours。
其中 第二个数要输的这个工资,我们可以按照什么呢? 我们可以按照这样的一个
iii 格式来打印 [无声]
好了,我们把这一段写完了,把这段写完了之后我们就
我们就有了这样的一二三,我们已经有了这样的一个三个类了,离我们五个类的目标已经又-
近了一步 所以我们还要派生一个,这样的一个
呃,这样的一个
销售销售类的这样的一个成员 public
class 那么它是 Comm,miission
根据这样的一个 完成的销售额多少的这样的一个雇员
[无声] 它也是从这个
Employee 里来派生的 这个的写法完全是和前面两个类是类似的
那么它我们说了,对于这样的一个销售l类来讲,那么它应该有这样的一个总的销售额
[无声]
总的销售额
以及它的这样的一个,对,因为这个百分比就是他的提成啊
提成的这样的一个百分比
[无声]
那么,有了这两个
有了这两个东西,四有变量之后,同样的我们为这两个四有变量要创建什么呢?
要创建两个跟前面两个类 一样的这样的一个属性,我们就可以写快一点了
快不到哪去,decimal GrossSale
get
return
[无声] set
[无声]
0 value
然后下面是这个,再来一个属性 public
decimal [无声]
Commission Rate
get return
commissionRate [无声]
set commissionRate
= value 等于 0,No Yes,大于0,否则是
0 这个是0 那么写完了这两个属性了之后,下来就应该是这个类的
public 这个类的构造函数
com commissionEmployee
构造 函数,那么在这个构造函数里头,我们也应该是介绍的是四个参数
其中的 name string 还有这个 ssd
是基类所要求的 以及它自己所要求的这样的一个
呃 总的这样的一个销售额,总的这样的一个销售额
总的这样的销额 我们用一个用一个什么样的变量名字来把它表示一下呢?
总的销售额我们就简单的写 sales 就行了
以及 它这个销售额的提成,销售额的提成
那么其中,嗯 其中什么?其中
name 还有这样的一个 销售 ssd
是基类的所要的 那么对于自己来说,我们所要求的是
呃,总的销售额 总的销售额应该等于这个什么,等于这个
sales 以及这个销售的比例
销售的比例,应该等于 rate
构造函数,这跟前三个
类都是一样的,那么构造函数写完了之后,我们只是简单地重复了前面几个类写过的同样的代码 我们
override override 然后重新怎么样呢?重写这样的一个
重写这样的一个 什么东西呢?重写一个这样的一个
earn 这样的一个函数,它的这样的一个工资的计算 那么对于这样的一个工资的计算,它应该是
它的这样的一个销售总额,销售总额
销售总额乘以一个什么呢?乘以一个它的这样的一个
提成的比例,就是它的这样的一个 工资了,那随后我们还有一个
显示的输出,public override ToString
在这个ToString 里面答案跟前三个类是一样的,我们返回一个
返回一个字符串来显示一下它们的信息 format
在这个 format 里面它应该是
[无声] employee
以及它的这样的一个 这样一个零
[无声] 加上,接下来呀
要显示的是它的这个总的这个销售额 [无声]
sale [无声]
总的销售额
以及接下来要显示的是它的这个提成的比例
rate
[无声] 所要显示的三个参数分别是:base.
ToString 以及
总的销售额 的比率
好了,我们又创建了这样的一个类,又创建了这样的类
那么创建完这样的一个类了之后,我们现在已经创建了
四个类了,四个类,这样我们创建最后的一个类 public
class 那么它是什么类呢?它是这样的一个基于底薪的
基于底薪的 基于底薪的这样的一个类
[无声] 那么这个类怎么样呢?这个类
并不是从employee 类派生的,而是从什么呢,而是从这样的一个 commission
employee 这样的一个类 派生的
那么在这样的一个,在这样的一个类里面,那么它就首先它需要有一个什么呢?需要有一个
需要有一个每周的这样的一个基本工资
基本工资,那么一样的它需要有一个 private
base
是它的底薪
那么这个底薪是
写错了 [无声]
需要有一个底薪
那么对于这样的一个,对于这样的一个
底薪来说,我们
public,我们给它创建一个属性来存取它
[无声]
[无声]
[无声]
[无声]
[无声]
[无声]
那么创建完了之后,我们给出它的这样的一个构造函数 那么它的这个,因为它的父类是
肯定是 employee 啊,对吧?所以说它的这样的一个 构造函数,我们注意一下它的父类不再是 employee 了
那么它的构造函数只能选择呢这样写的 base
那么它需要接收 string
name string
ssd 那么它的父类需要接收的是销售的总额
sales decimal
提成的比例 以及它自己的每周的这样的一个底薪
每周的这样的
底薪,它也是一个 然后冒号
base 在 base
里面怎么样呢,需要传递四个参数:名字 ssd,然后什么呢,销售额
以及 比率。
那么在我们这边怎么样呢,需要把底薪 需要把底薪复过来就行了
[无声]
好了,那么最后我们
public,我们还要怎么样呢,还要开始重返
重 重写。
那么我们首先重写的是这样的这样的工资计算函数
对吧?工资的计算函数,我们删掉了这样的一个系统为我们产生了这样的一个东西
它的工资的计算函数应该是什么呢?应该是 return
是应该在上一个的它的父类的,就是那个不计
底薪的员工的提成上加上什么呢?加上它的这个 底薪,就是它的这样的一个工资
那么完了之后我们还要重来一个 override
什么呢?ToString override ToString 来输出一下信息。
这个信息我们仍然通过 string 的静态函数 format
来合成一个字符串 它首先应该输出的应该是
base plus
commi smission
plus employee
冒号、 零
[无声] iii
然后 再输出一下它的底薪
base salary
1
那么对于iii的这样的一个字符串,我们直接调用它的上一级的 base.
ToString 来实现 就可以了,那么随后我们再输出它这样的一个底薪
base 的 ok !那么
呃,到此为止,我们创建了整个这样的一个五个类。
下来就是要做一些简单的测试。
那么在测试之前呢我们可以看下在 Visual Studio
里边我们有一个 除了有一个这样的解决方案资源管理器能够看到我们的这样的一个
代码写在这里面之外,在类视图里边 我们同样的可以从类的角度,类的角度看到我们这样的 每一个类。
单击一个类的时候底下的它的这样的一个成员, 哪些变量是私有的,对吧,哪些变量是
这样的一个属性,哪些变量是这样的一个方法,都标记的很清楚。
那么在同时在这里面,怎么样呢,我们可以
在它的这个,整个这个名称空间上面可以单击右键,选择怎么样呢,查看类图。
选择完查看类图了之后怎么样呢, Visual Studio 会为,会为我们自动画一个
这样的一个类的这样的一个继承图,我们可以更好的看到这样的一个方法。
这是我们 整个程序,我们程序有一个单独的 program 类是作为我们的测试用的。
我们先不去管它。
在 program 在我们创建的五个类里面 是这样的一个继承关系。
那么其中 employee 类呢怎么样呢是,是最大的这样的一个
基类,最大的基类,对吧,是最上面一层的基类。
然后在这个基类里边诞生,派生了一个这个类,派生了一个这个类。
也派生了一个这个类。
而这个类 Plus 呢怎么样,是通过这个类派生的。
和我们刚才在那个一开始我们设计的在幻灯片里面画的图,怎么样,完全是一致的。
我们按照这样的一个设想,完成了这样的一个类的继承的这样的一个编写, 编写。
那么你可以把这样的类图保存起来以便不要让它再从画。
那么在主函数里面我们就是可以简单的
对这样的类进行,怎么样呢,进行,简单的进行测试一下,进行测试一下。
呃,我们这样来测试。
首先我们 生成一个,几个这样的一个员工的对象,员工的对象。
[无声] salaried
Employee 等于一个
new employee
好我们换一行,这个比较长。
名字,Jhon。
然后他是一个固定员工,假设他的这个 ssid
号是111 111-111-111,这是我们给他的一个号码。
然后怎么样呢,然后我们还需要
还需要给的一个值应该什么呢,应该他这个是固定员工,那么他每次拿的值是一样的,只- 要给一个
800 然后后面 M ,标记为什么呢,标记他是一个 小数,小数。
那么我们就创建了这样一个员工。
我们还可以创建一个 Hourly
[无声] 等于
new。
在这样一个员工里面我们给他一个名字,名字叫,叫什么呢。
叫 karen
然后我们给他的一个号,222
-222-222。
他是一个小时工,那么他小时工呢那么就需要什么呢, 就需要有两个数字,每小时的这个
钱,那么假设他每小时是十六块七毛八。
那么以及他工作了多少个小时呢,假设他工作了 呃,39个小时,39个小时。
这是我们的这个小时工。
那么我们还可以再创建一个这样的一个 销售的。
[无声]
[无声]
那么假设我们这个销售工人起个名字叫作
Su,Susan,Sue。
[无声] 然后她的这个号就给成
333-333-333。
那么她这样的一个销售要给出她这样一个销售的总额,那么假如说她一共销售了
一千,一万块钱。
一万块钱。
那么 以及她的这个提成应该是多少呢,假如说提成是
呃,0.05, 提成是0.05。
那么再下来我们还有一个 BasePlus
BasePlus 这样的一个员工。
[无声]
[无声] [无声]
[无声]
那么,他的名字我们起一个
Bob ,Bob,那么他是444-444
-444,以及
那么他的这样一个,呃,销售额也是
销售额也是 高一点吧,销售额给个两万。
那当然啦,提成力度也是0.05,但是他还有一个底薪,底薪给三百
这是关于 这是我们一共创建了这样的一个四个对象。
那么对于这样的一个四个对象完了之后怎么样呢,那我们显示一下
[无声]
我们怎么样呢,我们
我们显示一下各人的收入。
显示一下什么呢,显示一下各人的收入。
来看一下怎么样,分别怎么样都是怎么样计算的。
那么在显示各人,在显示这样的一个
收入的时候我们可以分别调用什么呢,分别调用这样的一个
每一个,每一个类它自己的这样的一个
Earning 这样一个函数来怎么样呢,来
来显示它。
[无声]
那么,显示的结果就会 就会是每一个的这样的一个一个一个事情。
就是说我们来简单的显示一下,因为我们已经前面重载了这个 Console 这样的一个函数。
那么我们直接怎么样呢,我们直接 我们直接
先 Console WriteLine
我们直接把每个人的信息先打印出来。
第一个是 SalariedEmployee,
然后怎么样呢,然后我们打印下它的这个所得。
[无声]
[无声]
[无声]
那么我们依次也可以做这样的一些,还可以继续打印这个第二
第二个这个员工。
hour
以及
我们这样的测试我们就 所以为了节约时间起见,我们只做这样的两个测试就可以了
好,然后我们首先再先运行一下我们的程序来看一下 我们现在看到了,那么
John 是 800,然后这样的一个 Karen 是 645.
42。
好了 那么在这里面,我们
并没有太多的涉及到这个多态的进程,现在接下来我们再做一个什么样的测试呢
我们下来再创建一个什么呢,创建一个具有四个元素的
Employee 这样的一个数组 数组,那么这样写
Employee [无声]
我们创建一个,这样的一个
具有 四个元素的这样的一个
Employee 的这样的一个数组 然后怎么样呢?然后分别怎么样呢?分别我们把刚才创建的这样的几个
对象那么存到这样的一个数组里面来 [无声]
[无声] 我们让它
0,第一个小写的 e
第一个应该等于我们的这个 这个,这个,然后
第二个应该等于的是按周拿工资的这个
然后第三个我们可以让它
这样的怎么样,让它等于这个 呃
这个提成的员工,那么最后一个是由底薪还有提成的员工
[无声]
然后我们创建一道
我们有了这样的一个数组了之后,那么怎么样呢?我们就可以怎么样,我们可以用一个 foreach
语句 来便利这样的一个数组 我们申明一个 var
这样的一个 当前,当前的员工 current
Employee,在什么呢,在这样的一个
Employee 数组里面,对于每一个
对于每一个当前的员工来讲,怎么样呢,我们可以直接输出他的 信息。
WriteLine currentEmployee。
那么每一个不同的 当前员工,都会输出他怎么样,他自己不同的信息,因为我们
overwrite了每一个 tostring 的员工。
同时在这样的一个方法里面我们还可以进一步 的做一些测试。
比如讲我们干什么呢,我们可以判断当前的这个员工怎么样呢
是不是什么呢,是不是一个这样的一个按照 底薪加成的员工
对吧,我们说了他肯定都是这样的一个 Employee,这没有什么判断的
所以判断他是不是一个更具体的一个 更具体的一个这样的员工,那么如果他是这样的一个
员工的话,那么怎么样呢,我们还可以怎么样呢? 对他的这样的一个薪水什么什么的
做这样的一些处理,譬如讲把他的这个薪水再提高一个 10% 等等等等
那么诸如此类的这样的一些一些方式、 一些问题
对吧,如果他是的话,那么我们就,就干一件什么事情呢? 我们就让他的这样的一个薪水增加
10%,可以在这样的一个代码里面 那么可以具体判断他每一个到底是哪一个 这样的员工。
就是我们再一次我们看到了这个 "is"
运算符的这样的一个用法 那么关于这样的一个事例,我们就写这么多
我们这个例子已经够长得了,到此为止了