[音乐] [音乐]
下面我们的这个 例23,仍然是一个有关"继承"的这样的一个示例。
那么在这样的一个例23的示例里面,我们将这样的一个创建一个
继承的这样的一个层次,来表示这样的一个客户和银行的这样的一个 账户。
那么所有的这样的一个客户可以使用什么呢?可以使用其账户进行存款或者取款。
那么这是一个银行账户的一个最基本的这样的一个功能。
那么完了之后,再这之上还应该有更具体的账户类型,譬如讲一个存款账户
可以有利息,而支票账户呢,则是要按事务收费的。
那么我们创建这样的一个 Account 这样的一个基类
基类来表示这样的一个基本的账户,那么派生类有一个存储账户和一个这样的一个支票账户。
那么在基类里面包括这样的一个变量,那么表示账户的这样的一个结余。
表示账户的结余,在这样的一个结余里面,我们怎么样呢?
我们通过构造函数确保结余是要大于 0 ,也就说这个账户不能欠钱。
那么同时我们还有一个 Credit 的方法,还有一个 Debit 的方法,怎么样呢?减少这样的一个
增加或者减少这样的一个你账户里面的钱,对吧。
然后这样的一个结余面还有一个 get 函数,怎么样呢?可以返回当前的结余。
随后我们还有这样的一个派生类,派生类我们等一会儿呢 再来看,我们马上还有一个 Saving 的派生类和这样的继承类。
我们先到这儿,我们先把这样的一个基类来创建一下。
[无声] [无声]
我们新建一个 Visual C# 的控制台应用程序。
我们,我们把这样的名字
例23的这样的例子,在这个例子里面我们 Okay
我们做一个简单的注释吧。
例23
银行 账户。
好,我们来,先来创建我们的这样的一个基类。
public Account
public 根据这样的一个要求,在这个基类里面我们有一个私有的变量。
是这样的一个浮点型的变量,叫做 balance。
那么
它是用来这样的一个表示这样的一个账户的这样的一个结余。
同时我们提供一个这样的一个构造函数。
那么这个构造函数能够初始化这样的一个账户的结余。
是吧账户的结余。
当然啦,对于这样的一个账户结余来讲,我们应该怎么样呢?
我们在复制之前要判断一下,判断一下它是不是大于 0 的。
它是不是大于 0 的。
[无声] 当然它也可以等于 0。
那么如果是的话,那么就把这个 b 的值赋给它,否则的话,我们就让它初始化为 0。
初始化为 0 ,这是我们提供的这样的一个构造函数,那么我们
作为一个,个人觉得,作为一个 比较良好的这样的一个编程习惯,我们在提供一个这样的一个
不带任何参数的这样的一个构造函数,我们直接把这个 balance 的值赋为 0。
赋为 0。
[无声] 那么赋为
0 了之后,赋为 0 了之后。
我们根据看一下我们这刚才这个片子上面是怎么写的呢。
呃…… 现在这样的一个构造函数确保初值大于 0。
然后我们还有一个 Credit 方法,还有一个 Debit 方法。
Cedit 方法和 Debit 方法,我们来创建一个这样的一个东西。
[无声] Credit
方法,那么这个方法里面,当然呢我们这个方法里面接收这样的一个参数。
这样的一个参数,那么增加的这样的一个 钱,接收这样的一个参数。
那么在这个方法里面,我们可以直接把这样的一个 这样的一个
增加的钱数直接加到我们的账户余额里面去。
[无声]
直接增加到这样的一个账户里面去,同时我们怎样呢?还有一个
public 这样的一个
Debit 方法,那么它是可以取钱的。
[无声]
那么也就说,它怎么样呢,但是它首先要判断一下这样一个
账户里面的钱这个够不够取对吧,如果不够取的话这个操作就会被 禁止掉。
那么,if 如果,如果这个
balance 是大于等于 m 的话, 那么也就说账户里面还有足够的钱是可以取的。
同时呢,我们后面会看到我们由于,我们还要判断一下他到底取没取钱。
再说我们改一下,我们不把这个,这个函数设定成 void 型,而把这个函数设定成什么呢?
Bool 型,Bool型的,如果我们取钱取成功了的话,我们就返回一个 true,如果失败了话,
如果确实能够取钱,如果确实能够取钱,那么账户的钱还够的话, 那么当然呢,新的这个
balance 应该是,应该是 应该是把这样的钱怎么样呢,减掉,把这个钱减掉。
然后同时怎么样呢,return 返回了一个 表示什么呢,表示取钱是成功的,else
[无声] 否则的话怎么样,否则的话我们将保持账户的
账户的这样的一个资金是不变的,不变的,因为这个钱就不够取对吧, 不够取,我们返回一个 false 表示取钱失败了。
表示取钱失败了。
那这是我们这样的一个 Debit 这样的一个函数。
同时我们还知道,我们可以查询这个账户的值,查询这样的一个账户的值。
那么也就是说什么呢?也就是说我们 提供这样的一个属性。
public [无声]
[无声] balance。
对于这样的一个 属性来说,对于这样的一个属性来说,它只能够怎么样呢?只有一个
get 函数,只有一个 get 函数 return 返回我们这个
小写抬头的这个 balance,它没有这个 set 函数,不能够直接 我们得通过
Credit 函数来给里面存钱,不能够直接对这个余额进行这样的一个
数值的这样的一个操作,只能通过 Credit 函数来增加。
来增加,但是我们只有一个 get 没有这样的一个 set,没有 set。
好了,那么这就是我们这样的一个基类,我们这样的一个基类基本上就已经
写好了,那么下来我们再来看一下这题目后面的,后续的要求。
在后续里面,我们还要创建一个这样的一个派生类,那么 Saving Account,来作为它的这样的一个
存储账户,那么在这个存储账户里面要包含一个
这要包含一个什么呢?要包含一个指定的利率。
比如说这个,这个利息,那么这样的一个 Saving Account 的构造
函数接收这样的一个初始结余还有一个利率的这样的一个初值。
那么它利用一个这样的函数,Calculate这个 interest怎么样呢?interest怎么样呢?返回一个这样的一个
浮点数的值表示这样的一个账户得到的这样的一个利息。
那么接下来方法就是什么?就是账户的结余乘以这样的一个
利率值,就是我们的得到利息,当然这个算法是比较简单的,也是作为简单的一个示例来做的。
并没有考虑到什么时间呢,几个月的利息之类的关系。
好了,我们来看一下,public class
Saving Account
然后冒号, Acc,从什么呢,从 Account 怎么样呢,继承这样的一个类。
在我们继承的这样的一个类里面,我们新添了一个 float
型的这样的一个 私有型的变量,
那表示的是这样的一个利率,当然了我们还有这样的一个构造函数,
在这个构造函数里面它接受了这样的一个
两个这样的一个变量,一个是结余
一个是什么呢,一个是利率,一个是利率。
其中这个,其中这个 结余 i
我们是通过上面的关系来怎么样,继承的, 所以我们直接传递给基类的构造函数
base, b,
那么当然了这个利率是在这样的一个类里面怎么样呢,新添加的, 我们让它等于
i,等于 i,这是我们构造出来了这样的一个 基类,这个基,这个
SavingAccount 当然也同时继承了 Account 里面的那个 credit 增加的函数和 debit
这样的一个减少的这样的一个 方法或者函数,那么完了之后我们按照
当然了,按照这样的一个题目的要求,我们还要有一个计算 计算这个 CalculateInterest
计算这样的一个 利率的这样的一个公开的这样的一个函数,这样的函数。
介绍一个公开的利率的函数,那么应该是
public,那么
它会返回一个这样的一个新的利率值,所以这个函数的返回值是一个 float
型的, 我们叫做 CalculateInsterest,那么当然了它这个返回值比较简单,它简单的就是
return 这时我们想到
了一个小小的问题,这时候它 return 应该 return int interest,我们这样的一个
利率值乘上一个什么呢,应该乘上一个 balance,乘上一个 balance。
那么我们并没有把上面的 这个 balance
怎么样呢,小写的这个 balance 设计为什么呢, 设计为一个公有的,设计为一个公有的。
或者设计为一个 protected,它是一个 private 的。
那对于 private 的来讲,我们是没有办法直接在底下写怎么样,写 balance 的, 这样的呢会出错,这样会出错。
因为私有变量虽然可以继承,但是不能够访问。
跟没继承一样。
那么 R 但是这 个好处是什么呢?好处是我们还是提供了一个公有的这样
一个,这样的一个属性值,可以得到这样的一个变量,所以说我们用这个属性来做。
那么还有一个设计方案呢,还有一个设计方案,就是你可以把这样的一个 这个小写的 balance
前面的 private 这样的变量怎么样呢,改成 protected, 改成 protected
型的,那么有了这样的一个 protected 型的这样的一个变量之后怎么样
呢,我们也可以在这里面就可以直接继承而直接使用小写的这样的一个 balance 来做这样的一题了。
那么至于什么设计,可以根据自己的实际情况,随意的这样的进行调整。
那么下来,下来根据这样的一个
题目的要求,根据这样题目的要求,我们除了有这样的一个类继承之外,我们还有一个 我们还有这样的一个
class 这样的一个支票账户,也就是我们的这个 CheckingAccount 要怎么样呢,要继承。
在这里面怎么样呢,在这里面 它要包含了一个,同样也包含了一个新的这样的一个实例变量,
浮点型的实例变量,表示每笔交易的这样的一个费用,这个费用当然了,在这样的我们的设计- 里面,它是一个固定的值,
那么对于这样的一个费用来讲, 那么构造函数可以初始化这样的一个费用和这样的一个新的这样的一个参数。
那么在这时候它要重新定义这样的一个存款和取款的方法, 因为它跟账
Account 和存储 SavingAccount 完全不一样, 那么使事物执行成功的时候,从账户的结余中怎么样,减去这样的一个
手续费,那么也就是说,在我们这样的一个 增加存款的时候和这样的一个减少存款的时候,都怎么样呢,都需要
这样的一个手续费,手续费。
而对于这样的一个 debit 方法,只有在实际取钱的时候才
怎么样呢,才扣除这样的一个费用,也确保怎么样,所取的这样的一个量 不能超过账户的这样的一个结余,结余。
那么ok,我们,假设我们 [无声]
[无声] CheckingAccount
从它这个类里面从它继承, 在这类里面我们仍然也增加了一个
private 型的这样的一个 float
这样 的一个变量,表示这样的一个手续,这样的一个费用,
那么同时我们怎么样呢,有一个 public
public 这样的一个 CheckingAccount
这样的一个构造函数,在这个构造函数里面 传递了两个参数,一个是账户的结余,一个是
那个要手续的费用,其中账户的这个结余怎么样呢, 账户的结余
账户的结余是传递给基类的。
传递给基类的账户的结余。
而这个 费用怎么样呢,是给自己的,是给自己的。
那么有了这样的一个 构造函数了之后我们需要重写一下它的这个
debit 方法,那么也就是说当这样的一个 取值怎么样呢,成功的时候怎么样呢,我们需要从账户里面怎么样呢,
从这样的一个里面扣除这样的一个手续费。
那么当你每取一笔钱的时候就需要这样的扣除这样的一个手续费,
那么应该怎么样来做这个呢?我们可以把 public
我们声明为这样的一个 public,我们声明一个新的
new void Debit 方法,
那么在里面取 m
个钱, 那么在这样的一个 debit
方法里面, if 如果怎么样呢,如果我们可以调用这样的一个基类的 base.
Debit 方法,如果这样的一个取钱是成功了的话,
那么同时我们还需要怎么样呢,还需要再从这样的一个 再从这样的一个
账户的结余里面怎么样呢,再扣除这样的一个 m 的手续费,
那么这时我们的问题就来了,由于我们在这样的一个 Account
里面 把我们的这个 balance 怎么样呢,声明的是这样的一个 private
型的这样的一个变量,所以说我们还没有 办法通过直接写
balance 怎么样呢,减去这样的一个费用来进行 扣除这样的一个手续费,而我们怎么样呢,而我们只能够
再一次调用什么呢,可以再次调用这样的一个 base.
基类的这样的一个 debit 方法怎么样呢,来扣除这样的一个 手续的费用,手续的费用。
那么当然了,也许你剩下的钱不够扣手续费了,不够扣手续费了,
那么这个我们暂时去没有考虑,没有考虑,我们可以重新设计下这个类,使它更加合理一些,
所以我们这个例子来说,我们只是简单的做一些语法上的示例, 在语法的示例里面我们首先看到了,我们使用了关键字
new, 重新定义了一个新的这样的一个 debit 方法,debit 方法。
我们虽然这个 debit 方法是 void,不返回值跟我们基类的这样的一个
debit 方法是不一样的,但是我们说了,两个方法的
区别不能够通过,仅仅通过返回值来区别, 所以说这两个方法不管理 void 还是 float
其实它们应该是具有一个相同 的这样的一个牵邻的这样的一个方法,所以说我们仍然可以通过这样的一个new
需要通过一个 new 来怎么样,重新声明了一个新的 debit 方法,
那么在这个时候我们如果要,还要访问老的这样的一个 debit 方法的话,我们可以显式的使用 base.
debit 怎么样呢,方法来进行,对老的 debit 方法怎么样,进行一个访问。
ok,那完了之后,我们可以在,简单的在这样的一个主函数里面对这样的一个
我们所做的这个东西,csa 这样的一个做一个简单的这样的一个测试,对吧,做一个简单的测试。
也可以在这个 account 里面存上这个 23 块钱,那么利率是
0.23, 之类的,做一个简单的测试,那么
我们怎么会输入错? 那么我们这个方法里面我们需要给出 iii
一个 后缀,那么 f 那么明示这样的它后面是一个这样的一个
浮点型的这样的一个变量,因为我们并不存在从一个 整数到这样的一个浮点数,或者从一个
double 到浮点数这样的一个 显示的转换,在 c sharp
里面这样的转换还是比较严格,不像在这个 c++里面可以这样的写。
那么然后也可以调用什么呢,也可以调用 sa
的这样的一些其他的这样的一个 我们通过这样的一个 create
的方法怎么样 呢,可以为它增加怎么样呢,一些这样的一个钱数。
增加这样的一个钱数,那么还可以通过这样的一个 Console.Writeline
怎么样呢, 我们还可以通过
这样的一个属性,balance,balance 属性怎么样呢,写错了。
通过这样的一个 balance 的属性,得到当前这样的一个账户的 结余,账户的结余。
那么也可以 创建这样的一个 Checking,这样的一个支票的 这样的一个账户,
[无声] [无声]
那么我们每笔费用是一块钱,一块钱,
通过这样的一个方式来初始化对吧?然后可以从里面怎么样呢,
从里面取出来这样的一个,从里面取出来, 取出来这样的一个15
块钱,15 块钱,然后怎么样呢, 然后同时我们也可以
也可以再一次打印下它的这个结余。
我们做一些这样的一个简单的 测试,来看一下我们的类,大概是能够运行的,按一下这个
Ctrl f5, 运行下,我们看到前面是 57,后面是这样的一个 18。
这样的 18。
我们在 23 的基础上增加了 34 块钱了之后,账户结余就是
57, 在 34 块钱里面取掉了这样的一个 15 块钱了之后,应该是
一个 19,那么再扣掉了一个手续费了之后,应该是一个 18 块钱。
ok,那么对于这样的一个
例子,我们主要是看到了这样的一些继承,以及继承里面的这样的一个如果要 重写一个跟这样的一个
基类完全一样的函数,并且实现一个新的功能的话,我们可以使用关键字 new,
在马上后面事例里面我们还可以看到还有另一种的方式,就是多态的改变方式,
根据实际情况来选择是使用基类的函数,还是使用这样的一个 不是,不是选哪一个这样的一个
更合适的这样的一个函数,来做这个题,那么使用这样的一个 我们的关键字
overwrite 重写,那么它跟 new 怎么样呢,是完全作用是不一样的。
我们会在后面的例子马上就看到,这个例子我们就 讲到这儿。