题目:
用户有一张信用卡,信用卡有一个总额度;每个月会有信用卡账单显示月消费总额,月消费总额是小于信用卡总额度的;用户有若干储蓄卡,可选择某张储蓄卡进行还款;还款是指从储蓄卡中划走信用卡的月消费总额到信用卡;如果储蓄卡余额不足则还款动作不成功。
要求:
①必须使用委托 ②事件的触发方式是每个月的到期还款日。
代码实现:
信用卡类
class CreditCard
{
private int money = 0, creditlimit, deadline = 7;
//构造函数,设置信用卡的信用额度
public CreditCard(int creditlimit) => this.creditlimit = creditlimit;
public int Money { get { return money; } }
public int Deadline { get { return deadline; } }
//使用信用额度
public void spendmoney(int money)
{
if (this.money + money > creditlimit)
Console.WriteLine("超出信用额度");
else
this.money += money;
}
//委托和事件
public delegate void PayBack(int data);
public event PayBack DueData;
//推送
public void Event(int data)
{
//deadline是还款日期
if (data == deadline)
{
Console.WriteLine("还款金额为:{0},已到还款日期",money);
DueData(money);
}
else
Console.WriteLine("还款金额为:{0},未到还款日期", money);
}
}
储蓄卡类
class DebitCard
{
private int money;
private string name;
public static bool flag;
public DebitCard(int money, string name)
{
this.money = money;
this.name = name;
flag = false;
}
public string Name { get { return name; } }
public int Money { get { return money; } }
//扣款
public void drawmoney(int money)
{
this.money -= money;
}
//还款的方法
public void Repay(int money)
{
if (!flag)
{
if (money <= this.money)
{
drawmoney(this.money - money);
flag = true;
Console.WriteLine("已用{0}储蓄卡还款{1}元", name, money);
}
}
}
}
Main()函数
public static void Main(string[] args)
{
CreditCard card = new CreditCard(2000);
DebitCard card1 = new DebitCard(300, "card1");
DebitCard card2 = new DebitCard(3000, "card2");
DebitCard card3 = new DebitCard(200, "card3");
//订阅
card.DueData += card1.Repay;
card.DueData += card2.Repay;
card.DueData += card3.Repay;
card.spendmoney(2000);
card.Event(7);
}
运行截图
总结
在开始解题之后,发现对委托和事件还是没掌握好,许多地方都一知半解。在查阅了许多资料依然有地方存在疑惑,最后是在室友的讲解下豁然开朗。在理解加深后再次实现的过程中还是遇到了许多问题的,比如代码中的一个bool标志,一开始没用static,导致最后输出会每个卡都扣款,检查后发现应该使用static修饰。