题目

应用场景解释:用户有一张信用卡,信用卡有一个总额度;每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的;用户有若干储蓄卡,可选择某张储蓄卡进行还款;还款是指从储蓄卡中划走信用卡的月消费总额到信用卡;如果储蓄卡余额不足则还款动作不成功。
要求如下:①必须使用委托②事件的触发方式是每个月的到期还款日;

题目分析

使用委托实现信用卡用户定时还款功能,C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托可以将方法引用封装在委托对象内。然后调用该委托对象就可以执行委托对象内方法引用指向的方法,而不必在编译时知道将调用哪个方法。

需要注意的点有:

1.信用卡的成员是消费额度,还有一个最大额度来限制。

2.如果一个用户有多张信用卡,需要解决广播给信用卡的同时避免重复扣款。

3.储蓄卡余额不足会显示还款不成功。

代码实现

程序主要分四大部分,定义了储蓄卡类,委托,信用卡类和主函数。

信用卡

class CreditCard{private int consume;private int maxconsume;public delegate void SendAllConsumption(int count);
public void Date(int day){ if (day == 1){System.Console.WriteLine("到达还款日,将扣款{0}", consume);BeginMonth(consume);}}// 当到达还款日即每月1号时,开始结算,把款项广播给每张储蓄卡public CreditCard(int max){this.consume = 0;this.maxconsume = max;}}

储蓄卡

 class DebitCard{private string name;private int balence;private static bool Settled;public int Balence{get { return balence; }}public void Save(int a){balence += a;}public void draw(int a){balence -= a;}public string Name { get { return name; } set { name = value; } }public DebitCard(string name){this.name = name;balence = 0;Settled = false;}}
public void SettleHandler(int count){// 如果没有结算,那么尝试扣款。if (!Settled){if (balence - count <= 0)System.Console.WriteLine("{0}余额不足", name);else{balence -= count;Settled = true;System.Console.WriteLine("{0}已成功扣款{1}", name, count);}}}

为了防止重复扣款,我们需要定义一个静态成员Settled,来标识当前这一次广播其他的储蓄卡是否已经扣款成功,如果成功Settled=true。

委托

 public event SendAllConsumption BeginMonth;public int Consume{get { return consume; }}public void Expend(int a){if (consume + a <= maxconsume){consume += a;}else{System.Console.WriteLine("剩余额度不足!");}}

主函数

public static void Main(string[] args){CreditCard cdcard = new CreditCard(100000);//定义一张最高消费额十万的信用卡DebitCard dbcard1 = new DebitCard("card1");DebitCard dbcard2 = new DebitCard("card2");DebitCard dbcard3 = new DebitCard("card3");//定义三张储蓄卡dbcard1.Save(9000);dbcard2.Save(6000);dbcard3.Save(3000);//往储蓄卡中存钱cdcard.BeginMonth += dbcard1.SettleHandler;cdcard.BeginMonth += dbcard2.SettleHandler;cdcard.BeginMonth += dbcard3.SettleHandler;//订阅事件//定义消费4000元cdcard.Expend(4000);//结算,传递参数为当前日期cdcard.Date(1);}

总程序

using System;
namespace windowshomework2_1
{class Bank{class CreditCard{private int consume;private int maxconsume;public delegate void SendAllConsumption(int count);public event SendAllConsumption BeginMonth;public int Consume{get { return consume; }}public void Expend(int a){if (consume + a <= maxconsume){consume += a;}else{System.Console.WriteLine("剩余额度不足!");}}public void Date(int day){ if (day == 1){System.Console.WriteLine("到达还款日,将扣款{0}", consume);BeginMonth(consume);}}// 当到达还款日即每月1号时,开始结算,把款项广播给每张储蓄卡public CreditCard(int max){this.consume = 0;this.maxconsume = max;}}class DebitCard{private string name;private int balence;private static bool Settled;public int Balence{get { return balence; }}public void Save(int a){balence += a;}public void draw(int a){balence -= a;}public string Name { get { return name; } set { name = value; } }public DebitCard(string name){this.name = name;balence = 0;Settled = false;}public void SettleHandler(int count){// 如果没有结算,那么尝试扣款。if (!Settled){if (balence - count <= 0)System.Console.WriteLine("{0}余额不足", name);else{balence -= count;Settled = true;System.Console.WriteLine("{0}已成功扣款{1}", name, count);}}}}public static void Main(string[] args){CreditCard cdcard = new CreditCard(100000);//定义一张最高消费额十万的信用卡DebitCard dbcard1 = new DebitCard("card1");DebitCard dbcard2 = new DebitCard("card2");DebitCard dbcard3 = new DebitCard("card3");//定义三张储蓄卡dbcard1.Save(9000);dbcard2.Save(6000);dbcard3.Save(3000);//往储蓄卡中存钱cdcard.BeginMonth += dbcard1.SettleHandler;cdcard.BeginMonth += dbcard2.SettleHandler;cdcard.BeginMonth += dbcard3.SettleHandler;//订阅事件//定义消费4000元cdcard.Expend(4000);//结算,传递参数为当前日期cdcard.Date(1);}}
}

运行结果截图

卡一余额充足

卡一余额不足

心得体会

委托与事件是C#中新学到的知识点,虽然它们的定义很明确,但是刚开始接触时合上书就不知所云了,为了完成此次实验我参考了一些案例和方法,对委托与事件的认识有了深一步了解:委托属于一个定义,是和类、接口类似的,通常放在外部。我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。事件属于类的成员,所以要放在类的内部。委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。

仓库

仓库clone地址为:

https://gitee.com/hax666/windows-homework/tree/master/windows%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1

作业1:C#使用委托实现信用卡用户定时还款功能相关推荐

  1. 使用委托实现信用卡用户定时还款功能

    一.问题描述 C#使用委托实现信用卡用户定时还款功能 本题的应用场景解释:用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可 ...

  2. 委托实现信用卡用户定时还款功能

    信用卡用户定时还款 一.委托类 二.储蓄卡类 三.信用卡类 四.main函数 结果截图 总结 一.委托类 代码如下: class Delegates //委托类{public delegate voi ...

  3. C#使用委托实现信用卡用户定时还款功能

    题目: 用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可选择某张储蓄卡进行还款:还款是指从储蓄卡中划走信用卡的月消费总额到 ...

  4. C#委托实现信用卡用户定时还款功能

    用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可选择某张储蓄卡进行还款:还款是指从储蓄卡中划走信用卡的月消费总额到信用卡: ...

  5. C# 使用委托实现信用卡用户定时还款功能

    一. 应用场景说明 应用场景解释:用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可选择某张储蓄卡进行还款:还款是指从储蓄卡 ...

  6. 设计实现信用卡用户定时还款功能

    信用卡用户定时还款功能 功能说明 代码 结果截图 gitee地址 功能说明 使用委托实现信用卡用户定时还款功能.用户当月若需要还款,则订阅还款提醒功能,还清欠款后,提醒用户已还清. 代码 建立一个Us ...

  7. 使用委托实现信用卡用定时还款功能

    使用委托实现信用卡用户定时还款功能 首先我要创造了一个委托类,然后继续创建了信用卡类,储蓄卡类和实现还款的还款类.最后填写main函数 using System; using System.Colle ...

  8. Windows第一次博客作业:委托实现信用卡用户定时还款

    一.题目描述 用户有一张信用卡,信用卡有一个总额度:每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的:用户有若干储蓄卡,可选择某张储蓄卡进行还款:还款是指从储蓄卡中划走信用卡的月消费 ...

  9. 实现信用卡用户定时还款功能

    使用委托完成要求,代码如下 using System; using System.Collections.Generic; using System.Text; using System.Web; u ...

最新文章

  1. JSP项目目录中每个文件夹及配置文件的作用
  2. Keras【Deep Learning With Python】实现线性回归模型
  3. boost::python模块实现使用原始指针访问数据的示例
  4. vs2012常用快捷键总结
  5. asp将新闻内容写入mysql数库据_在ASP.net中保存/取出图片入/从SQL数据库
  6. python导入data-Python通过load data导入MySQL数据
  7. C#文件和目录的操作
  8. 云桌面三大谎言之GPU虚拟化
  9. 复制PS图层的样式到其它图层
  10. elipse配色方案
  11. 1090: 哥德巴赫猜测
  12. thinkphp手册
  13. win10搭FTP与单片机通信:配置+编程实现的完整流程
  14. intellij背景护眼色调节
  15. Codeforces #199前三题
  16. 令人头秃的:你的主机中的软件中止了一个已建立的连接
  17. 大数据处理架构演进历程,文末留言有机会获取Flink图书
  18. macOS下长截图的两种方法
  19. 1998世界杯主题曲[生命之杯]Ricky.Martin
  20. HDU - 5974 A Simple Math Problem 题解

热门文章

  1. Android 禁止键盘弹出 关闭键盘 禁用键盘 禁用输入法 关闭输入法
  2. python中词云图是用来描述_Python如何实现中国地图词云图
  3. 玩凤凰沙盘的几点思考
  4. 酷派Y60-C1官方ROM内容解析
  5. [压位DP]Hdu 6149——Valley Numer II
  6. 【WCN6856】WiFi 5G 接口启动失败问题解决
  7. 从充电宝到换电站,数字孪生原来可以这样用
  8. STM32F103高级定时器死区时间的计算
  9. 程序员如何选择适合自己的企业?
  10. 三星android平板,三星也不忘Android平板,或推带虹膜识别的Galaxy Tab S4