导读:
应用场景:
信用卡还款是银行系统的重要业务,业务流程说明如下:
- 用户有信用卡和储蓄卡,储蓄卡有查询余额和取款功能,信用卡能够查看账单金额、查看还款日和查看余额三个功能;
- 请使用委托与事件实现下列功能:用户可自由设置信用卡还款关联的储蓄卡,当还款日到期时进行账单金额的自动划扣;
关键词介绍:
委托:委托是一种可以指向方法的引用,可以理解为一种函数指针,是类型安全的。它类似于C++中的函数指针,通过对于方法特征和返回值类型的声明,封装了具有相同特征和返回类型的方法。
事件:事件使用委托来封装触发时将要调用的方法,事件是一种函数成员。
说明:
1. 当还款日期(C#DateTime.Today.Day)到时,会进行自动扣款。
2. 当银行卡余额不足时会显示付款不成功。
3. 利用委托与事件还款。
代码结构
储蓄卡类,信用卡类,委托,主函数。
代码
储蓄卡
先创建一个储蓄卡类,其中包含了获取余额方法,还款方法。
class DepositCard
{
public int amount; //余额
public int getrest()
{
return amount;
}
public void Account(int balance) //还款
{
amount += balance;
Console.WriteLine("今天是本月的{0}号,取款{1},储蓄卡余额为:{2}。"
,DateTime.Today.Day, -balance, amount);
}
}
信用卡
再创建一个信用卡类,其中包含了获取余额方法,获取还款日期方法。
class CreditCard
{
private int billamount;
private int repaymentday;
public CreditCard(int billamount, int repaymentday)
{
this.billamount = billamount; //余额
this.repaymentday = repaymentday; //还款日期
}
public int getbillamount() { return billamount; }
public int getrepaymentday() { return repaymentday; }
public void Display() { Console.WriteLine("信用卡余额为:{0}", billamount); }
}
委托
创建了一个委托类,包含了委托和事件,和通知订阅对象的方法。
class CreditCardDelegate //信用卡委托
{
public delegate void repay(int balance); //委托
public event repay Paytime; //事件
public void func(int blance)
{
if (Paytime != null) { //防止事件未订阅就启动
Paytime(blance);
}
}
}
Main函数
class Program
{
static void Main(string[] args)
{
DepositCard depositCard = new DepositCard();
depositCard.amount = 10000; //储蓄卡余额
CreditCard creditCard1 = new CreditCard(-2000, 9); //new了三张信用卡
CreditCard creditCard2 = new CreditCard(-3000, 13);
CreditCard creditCard3 = new CreditCard(-5000, 29);
depositCard.getrest(); Console.WriteLine("");
List<CreditCard> Cards = new List<CreditCard>();
Cards.Add(creditCard1); Cards.Add(creditCard2); Cards.Add(creditCard3);
CreditCardDelegate Ccd = new CreditCardDelegate();
foreach (CreditCard card in Cards)
{
Console.WriteLine("信用卡开始执行委托还款。。。。。。");
if (card.getrepaymentday() == DateTime.Today.Day)
{
if (depositCard.getrest()<-card.getbillamount())
{
Console.WriteLine("你的储蓄卡余额不足,逾期太久将扣除你的个人信用。");
continue;
}
Ccd.Paytime += new CreditCardDelegate.repay(depositCard.Account);
Ccd.func(card.getbillamount());
Ccd.Paytime -= new CreditCardDelegate.repay(depositCard.Account);
}
Console.WriteLine("");
}
Console.ReadLine();
}
}
说明:
实例化储蓄卡,设置余额为10000,创建三个信用卡,并添加入数组,创建委托类,遍历信用卡数组,如果余额不足跳过此次循环,并予以提示。如果余额充足,订阅事件(+=右边为创建委托),并使用func(即通知订阅对象的方法)方法,后使用-=取消订阅。
总程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 信用卡还款
{
class DepositCard
{
public int amount; //余额
public int getrest()
{
return amount;
}
public void Account(int balance) //还款
{
amount += balance;
Console.WriteLine("今天是本月的{0}号,取款{1},储蓄卡余额为:{2}。"
,DateTime.Today.Day, -balance, amount);
}
}
class CreditCard
{
private int billamount;
private int repaymentday;
public CreditCard(int billamount, int repaymentday)
{
this.billamount = billamount; //余额
this.repaymentday = repaymentday; //还款日期
}
public int getbillamount() { return billamount; }
public int getrepaymentday() { return repaymentday; }
public void Display() { Console.WriteLine("信用卡余额为:{0}", billamount); }
}
class CreditCardDelegate //信用卡委托
{
public delegate void repay(int balance); //委托
public event repay Paytime; //事件
public void func(int blance)
{
if (Paytime != null) {
Paytime(blance);
}
}
}
class Program
{
static void Main(string[] args)
{
DepositCard depositCard = new DepositCard();
depositCard.amount = 10000; //储蓄卡余额
CreditCard creditCard1 = new CreditCard(-2000, 9); //new了三张信用卡
CreditCard creditCard2 = new CreditCard(-3000, 13);
CreditCard creditCard3 = new CreditCard(-5000, 29);
depositCard.getrest(); Console.WriteLine("");
List<CreditCard> Cards = new List<CreditCard>();
Cards.Add(creditCard1); Cards.Add(creditCard2); Cards.Add(creditCard3);
CreditCardDelegate Ccd = new CreditCardDelegate();
foreach (CreditCard card in Cards)
{
Console.WriteLine("信用卡开始执行委托还款。。。。。。");
if (card.getrepaymentday() == DateTime.Today.Day)
{
if (depositCard.getrest()<-card.getbillamount())
{
Console.WriteLine("你的储蓄卡余额不足,逾期太久将扣除你的个人信用。");
continue;
}
Ccd.Paytime += new CreditCardDelegate.repay(depositCard.Account);
Ccd.func(card.getbillamount());
Ccd.Paytime -= new CreditCardDelegate.repay(depositCard.Account);
}
Console.WriteLine("");
}
Console.ReadLine();
}
}
}
运行结果
当到达本月9号时,
当到达本月13号时,
当到达本月29号时,
当卡内余额不足时(偷偷给第三张信用卡余额-1)。
总结
C#的委托只能封装具有相同类型的特征和返回类型的方法,使用委托需要三个步骤:1. 声明委托类型,2. 创建委托实例,3. 向委托实例注册方法。可以动态的更改一个委托所引用的方法,调用一个委托的代码每次都运行一个不同的方法。委托的优势是能引用多个方法。
事件:事件对外界隐藏了委托实例的大部分功能,仅仅暴露添加/删除事件处理器的功能,安全性更好。通过+=为事件注册委托,-=取消注册委托。事件只能在方法的外部进行声明,而委托在方法的外部和内部都可以进行声明。