[音乐] 例 22 包裹投递。 我们通过这样的一个例子再来讲述一下关于这样的一个类的继承。 那么我们知道邮局或者快递公司,那么不管是中通申通还是什么快递公司, 它可以提供不同的这样的一种投递类型。 譬如讲三日送达或者次晨达,不同的类型这样的一个费用就不同。 那么我们现在将来创建一个这样的一个继承层次来表示这样一个不同的包裹。 首先我们就用一个 Package 类作为这样的一个基类然后 让 ThreeDayPaackage 类然后以及 OvernightPackage 类作为它的派生类。 那么在基类里面我们包含发件人、 收件人的姓名、 地址, 以及包裹的重量。 那么包裹的重量,包裹的投递费用是这样的一个 标准投递费用,单位是按重量收费的,那么它的就是,最后的总的这样的基本费用就是 重量乘以这样的一个投递的标准费用。 那么在这样的一个基类里面 我们有一个构造函数,那么这个构造函数初始化了这样的上面一些这样的一些成员和这样的一些 基本的这样的一些量吧。 然后它有一个 public 的这样的一个 方法来就是 CalculateCost 怎么样来计算这样的一个包裹的基本费用的 公式。 随后我们将在这个类上面派生这个 ThreeDayPackage 和 OvernightPackage 它们是在这个标准费用的基础上将增加费用。 增加的费用是等于重量乘以额外费用的。 接下来我们看一下这样的一个 例子该怎么做。 启动 Visual Studio 我们新建一个 CSHARP 的空白应用程序,把它命名为我们的 CS HARP, CSHARP EX22 第 22 个例子 [无声] 好了,那么按照这样的一个,我们按照这样的题目的要求 一步一步来。 首先我们有一个 class 这样的一个 Package。 Pa k Package, p,a,c,k,a,g,e 没写太对 作为它的基类,那么讲这样的一个 在这个基类里面将包含这样的一个 发件人、 收件人的姓名、 地址以及包裹的重量,还有包裹的投递的标准费用。 那么无疑发件人、 收件人的姓名、 地址这些都应该是个 string 类型的变量。 那么包裹的重量应该是一个 小数 而以及投递的标准费用也应该是一个小数,好了, 我们来看一下。 Package 那么这样 这样的一些这样的存取数量它们都是保护类型的, 只能够通过这样的内部或者加输内部来存取。 同时我们也把它定义成这样的一个属性,定义成这样的属性。 那么,string 首先应该是这样的一个发件人的。 Sender Name [无声] get, set 首先我们有这样的一个 发件人的名字,protected Receiver [无声] [无声] [无声] [无声] get, set 以及收件人的地址 我们这些就简单地试立几个变量就行了,这些变量 [无声] 大同小异,没有太大的这样的一个区别。 同时 [无声] protected 我们有这样的一个包裹的重量,单位是这样的一个克。 那么包裹的这个重量我们并不善使用这样的一个匿名属性,因为我们要 检测一下这样的一个重量是不是一个正值。 它可能是一个负的。 以及这样的一个每克的这样的一个费用。 [无声] 每克这样的一个费用,那么它也应该是这样的一个 正的值。 随后我们写下这个 Package 的这样的一个构造函数。 [无声] 那么 Package 的这个构造函数应该接收所有的这五个参数 来初始化它们,应该 string sn string rn [无声] string address 以及 decimal weight 及 decimal 费用 那么在这 里面我们简单地就是把这几个值进行赋值就可以了。 [无声] [无声] rn 以及这样的一个 address 应该等于这样的一个 adr 那么对于这样的一个重量 和这样的一个费用来讲,我们还是为它们写一个 属性,那它把这个属性插入到这个构造函数的后面。 [无声] protected [无声] [无声] 中间是一个 get [无声] 接下来是一个 set 在一个 set 里面,我们首先要检查一下 value 是不是大于 0 的。 [无声] [无声] [无声] [无声] [无声] 好的那把,我们把这个重量置为 0。 [无声] [无声] 同样的我们还有再增加一个关于费用的属性。 [无声] [无声] [无声] [空白_音频] [空白_音频] [空白_音频] [空白_音频] [空白_音频] 那么写完这两个属性呢之后,我们 可以在构造函数里面通过对这两个属性进行这样的一个赋值,来达到检测 是它们这样的一个检测是否大于 0 的情况。 f 好了,那么在这样的 一个构造函数做完了之后,我们还要提供一个对外的一个 public 的这样的一个函数,那么这个函数计算这样的一个包裹的一个 投递的费用。 这个函数的名字叫做,我们看一下题目 题目,这个函数的名字叫做 CalculateCost。 [空白_音频] [空白_音频] 那么这个费用比较简单,这个费用就应该是 就应该是 费用乘上这样的一个重量的这样的一个 值,就是整个这样的一个包裹所要完成的这样的一个费用,这样的费用。 那么这是我们创建的这样的一个基类,它里面比较简单,就是有一些这样的一些字段 属性的值,然后只有两个这样的一个方法,一个是构造函数 一个是计算这样的费用的一个函数,OK。 那么下来,我们将从这样的一个类创建一个它的派生类,这个派生类是 Three, 三日之内寄达的, Threeday Package 那么它将从这个 Package 类继承。 从这个 Package 类继承了之后,它将增加,增加 一个自己的这样的一个变量,表示这是,这样的一个额外的这样的一个费率 是有多少。 protected decimal,我们将增加一个这样的一个 额外的这样的一个费用。 [空白_音频] 那么当然了,这样的一个额外的费用它应该 它应该 也是要 大于 0 的。 [空白_音频] [空白_音频] [空白_音频] [空白_音频] [空白_音频] [空白_音频] [空白_音频] [空白_音频] 那么有了这样的一个增加了一个新的属性了之后,我们再来看我们这个 派生类这样的一个构造函数。 那么这样的一个构造函数的写法,它首先它应该怎么样呢?后面跟的是一个参数总表。 也就是说要继承接收所有 自己的参数以及它的父类的构造函数需要的参数。 那么我们看在父类的构造函数里面,在父类的构造函数里面,一共接收了 1,2,3,4,5,其中接收了 5 个参数,2,3 个 string 那么两个这样的一个小数,那么在自己的这样的一个 派生类里面我们又增加了一个这样的一个小数,所以说在它里面应该是有 3 个 3 个这样的一个 字符串,3 个这样的小数,一共有什么呀? 应该一共有 6 个这样的一个参数。 [空白_音频] 那么在这 6 个参数里面,这 6 个参数里面, 我们打上一个冒号,其中,base 关键字,其中前 5 个 是依次要传递给它的父类的。 [空白_音频] [空白_音频] 而最后一个参数是自己的,这边新增加的 在这个派生类里面新增加的这样一个 iii ,用它来 初始化,用它来初始化。 现在下来的一个问题就是说是我们现在得需要在这样的一个 派生类里面也写一个这样的一个计算费用的这样的一个方法, 而这个方法应该是它的这样的一个基础费用再增加上 这样的一个重量乘以它的这样的一个额外这样的一个费用。 那么在这里面要注意一下, 我们再增加一个,再增加一个这样的一个函数了 之后,那么它也叫这个名字,并且它的返回值还有参数个数 完全的都和什么呢?它的父类怎么样,是一样的。 那么这样产生的,会产生一个所谓的隐藏的问题, 那么所谓隐藏的问题就是在 这个派生类里面,有一个和父类完全一样的 名字包,所谓完全一样是指的返回值 是一样的,名字是一样的,以及它的参数个数,参数顺序等等 都是完全一致的这样的一个,这样的一个 方法的存在,那么以后在这样的一个 ThreedayPackage 类里面调用这个 CalculateCost 的话,那么肯定只是调用的这样的一个 这个方法,而不会调用这样的一个基类的这样的一个方法, 所以说我们说在这样的一个派生类里面,这样一个完全重名的这样的一个 方法,隐藏了,隐藏了基类这样的一个方法。 那么 return base 应该是基类的这样的一个 方法的费用再加上一个 重量 乘以这样的一个额外的费用的值。 下面我们在主函数里面测试一下我们写的这样的一个 类。 回到我们的这个主函数里面来。 那么我们首先创建这样的一个 ThreedayPackage 这样的一个类的实例。 这个 tp 应该等于 new Threeday Package, 那么我们要给出它的 三个参数,一个是这样的一个发件人, 这叫 XIAOWANG ,那么一个收件人 收件人我们假设叫 XIAOMING 以及这样的发件的 城市, 以及这个包裹的重量假设是 900 克, 那么以及这样的一个费用 假设基本费用 0.234 , 那么在这里面要注意一下,注意的问题就是说是我们在这边写 0.234 的时候会默认它应该是一个 float 或者是一个 double 这样的一个数, 那么我们并不存在从一个 double 到一个这样的一个 decimal 这样的一个 映射的这样的一个转换,所以可能会这样呢会报错。 那么因此我们需要在这个 0.234 后面增加这样的一个 m ,明确 通知这样的一个数是一个 decimal 的数,它的一个后缀。 或者大写的 M,额外的费用 0.02 最好我们给这个克的后面增加这样的一个 m。 就不会有太大的问题了。 那么我们这样呢初始化好了 这样的一个数了之后,我们直接来计算一下这样的一个它的费用,我们直接输出就好了。 Console.WriteLine [空白_音频] 我们只调用 tp 的这样一个点它的这样的一个计算费用的这样的一个 公共的方法计算出它的这样的一个费用来显示, 那么我们运行一下这样的一个程序。 Ctrl F5, 我们看到费用应该是 228.6, 好 228.6。 [空白_音频] 当然,我们这个费用只是随便假设的,并没有什么实际的这样的一个意义。 OK,这道题我们就讲到这。