作业:C#利用委托和事件实现定期还款功能

本文介绍了如何使用C#的委托和事件来实现信用卡自动还款功能。当还款日期到达时,系统会检查储蓄卡余额并尝试自动划扣账单金额。如果余额不足,则显示付款失败。代码示例中展示了储蓄卡和信用卡类的定义,以及委托和事件的使用,包括订阅和取消订阅事件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 导读:

应用场景:

信用卡还款是银行系统的重要业务,业务流程说明如下:

  1. 用户有信用卡和储蓄卡,储蓄卡有查询余额和取款功能,信用卡能够查看账单金额、查看还款日和查看余额三个功能;
  2. 请使用委托与事件实现下列功能:用户可自由设置信用卡还款关联的储蓄卡,当还款日到期时进行账单金额的自动划扣;

 关键词介绍:

委托:委托是一种可以指向方法的引用,可以理解为一种函数指针,是类型安全的。它类似于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. 向委托实例注册方法。可以动态的更改一个委托所引用的方法,调用一个委托的代码每次都运行一个不同的方法。委托的优势是能引用多个方法。

事件:事件对外界隐藏了委托实例的大部分功能,仅仅暴露添加/删除事件处理器的功能,安全性更好。通过+=为事件注册委托,-=取消注册委托。事件只能在方法的外部进行声明,而委托在方法的外部和内部都可以进行声明。

源码gitee地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值