目录
一、项目说明
1、程序题目
请使用委托实现信用卡用户定时还款功能
2、应用场景解释
用户有一张信用卡,信用卡有一个总额度;每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的;用户有若干储蓄卡,可选择某张储蓄卡进行还款;还款是指从储蓄卡中划走信用卡的月消费总额到信用卡;如果储蓄卡余额不足则还款动作不成功。
3、功能要求
①必须使用委托
②事件的触发方式是每个月的到期还款日;
二、解题思路
1、业务流程图
2、功能设计
- 结合日常生活实际,对于信用卡还款粗略思索有四个类,分别是银行卡类(BankCard)、信用卡类(CreditCard)、银行类(Bank)、以及还款委托类(AutomaticPayment)。
- 银行卡类里面有银行卡的余额以及余额的set和get方法。
- 信用卡类里面有还款金额和还款日,他们的set和get方法,以及还款日到期还款方法。
- 银行类有充值余额的方法
- 委托类定义委托和事件以及自动还款方法
三、功能设计及核心代码
信用卡类
//信用卡类
class CreditCard
{
//还款金额
private int money;
//还款日
private string repaymentDate;
//还款金额的get,set方法
public void setMoney()
{
Console.Write("请输入本月需还款的金额:");
int money = Convert.ToInt32(Console.ReadLine());
this.money = money;
}
public int getMOney()
{
return money;
}
//还款日的get,set方法
public void setRepaymentDate()
{
Console.Write("还款日为:");
string repaymentDate = Console.ReadLine();
this.repaymentDate = repaymentDate;
}
public string getRepayment()
{
return repaymentDate;
}
//还款日还款方法
public void repayment(Bank bank, BankCard bankCard)
{
Console.WriteLine("今天是{0},还款日已到,此次需还款金额为 :{1}元,请还款。", this.repaymentDate, this.money);
int balance = bankCard.getBalance();
balance -= this.money;
bankCard.setBalance(balance);
while (balance < 0)
{
Console.WriteLine("对不起,当前余额为:{0},余额不足,请充值!!!", balance);
bankCard.setBalance(bank);
balance = bankCard.getBalance();
}
Console.WriteLine("恭喜您,还款成功,余额还剩:{0}", balance);
}
}
银行卡类
//银行卡类
class BankCard
{
//银行卡余额
private int balance;
//银行卡余额的get,set方法
public void setBalance(Bank bank)
{
int add = bank.add();
this.balance += add;
}
public void setBalance(int banlance)
{
this.balance = banlance;
}
public int getBalance()
{
return balance;
}
}
银行类
//银行类
class Bank
{
//充值余额
public int add()
{
Console.Write("请输入充值金额:");
int addMoney = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("恭喜您,成功缴纳人民币{0}元,欢迎下次光临!",addMoney);
return addMoney;
}
}
委托类
class AutomaticPayment
{
//定义委托
public delegate void delegateAutomaticPayment(Bank bank,BankCard bancard);
//定义事件
public event delegateAutomaticPayment eventAutomaticPayment;
//调用事件委托
public void auto(Bank bank, BankCard bankCard)
{
if(eventAutomaticPayment != null)
{
eventAutomaticPayment(bank, bankCard);
}
}
}
主程序
static void Main(string[] args)
{
//委托对象
AutomaticPayment objDelegate = new AutomaticPayment();
//银行实例对象
Bank bank = new Bank();
//银行卡实例对象
BankCard bankCard = new BankCard();
//信用卡实例对象
CreditCard creditCard = new CreditCard();
//设置银行卡本钱
//bankCard.setBalance(bank);
//设置还款金额
creditCard.setMoney();
//设置还款日期
creditCard.setRepaymentDate();
//订阅事件,还款方法
objDelegate.eventAutomaticPayment += new AutomaticPayment.delegateAutomaticPayment(creditCard.repayment);
objDelegate.auto(bank, bankCard);
}
四、结果截图
五、心得体会
-
委托是一种特殊的类,和普通类不同的是委托是对一类方法的抽象,因此只能在类内部定义内部类(包括委托、结构和枚举)而不能在方法中定义。
- 本次实验将委托与事件应用到实际的事情中,我更加熟悉了类的调用以及委托事件的用法,实验中需要注意:
(1)C#中事件:事件时属于类的成员,所以要放在类的内部。
(2)委托属于一个定义,是和类、接口类似的,通常放在外部。
- 在实验中,我遇到的困难主要是对委托基础语法结构不够熟悉,基本实现还有些生疏,对于委托方法参数的传递和调用开始还是不够了解,花了大量的时间,因对于委托触发事件再执行操作的机制还不够熟练。