继承

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 模拟银行_19_4_30
{
    class account//普通账户
    {
        //字段--私有
        //private string name;//用户名--实际--卡号
        //private decimal balance;//账户余额--decimal为钱的类

        //为了在继承中使用,我们加protected保护权限来供普通用户和子类继承使用
        protected string name;//用户名--实际--卡号
        protected decimal balance;//账户余额--decimal为钱的类
        ////无参构造方法--实际不能这样,无参用于教学理论
        //public account()
        //{
        //    name = "mary";
        //    balance = 2000;//余额
        //}
        //有参构造方法
        public account(string name, decimal balance)
        {
            this.name = name;
            this.balance = balance;
        }
        //当子类的查询和父类的不一样要重写,p116页
        //子类要重写父类的方法,父类必须定义为虚方法:在void前加virtual关键字
        //查询账户的功能
        public virtual void cx()
        {
            //输出账户的相关信息
            Console.WriteLine("操作成功!{0}的操作余额为{1}元。",name,balance);
        }
        //存款的功能
        public void ck()
        { 
            //提示用户存多少钱
            Console.WriteLine("{0}用户,您要存多少钱?",name);
            decimal amt = decimal.Parse(Console.ReadLine());
            //计算
            balance += amt;//balance=balance+ant
            Console.WriteLine("存款成功!");
            //查询
            cx();
        }
        //取款,无参无返回值
        public virtual void qk()
        {
            //提示用户取款多少钱
            Console.WriteLine("{0}用户,您要取款多少钱?", name);
            decimal amt = decimal.Parse(Console.ReadLine());
            //取款判断
            if (amt > balance)
            {
                Console.WriteLine("余额不足,操作失败");
                return;
            }
            //判断可以取款
            balance -= amt;
            Console.WriteLine("取款成功");
            //查询
            cx();
        }


//按cw按两下tab输出
//if一下tab快捷if框架
//其他快捷键自己设置
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 模拟银行_19_4_30
{
    class vip:account//vip可以透支,继承account类---格式。子类:父类
    {
        //父类权限允许范围内的,子类都可以继承..父类私有部分,子类不能继承,即不能使用
        //
        //添加子类自己的特性
        
        //透支的额度--私有
        private decimal debt;

        //构造方法不能被继承
        //实例化子类对象的时候,首先调用父类的构造方法,在调用子类自由的构造方法

        //子类的无参构造方法
        //子类完成默认值的设置,包括父类的字段
        //(1)p106页隐式调用父类的构造方法
        //public vip()
        //{
        //    debt = 1000;

        //}
        //(2)显式调用父类的构造方法
        //public vip()
        //    : base()//base关键字可以引用父类的对象;
        //{
        //    debt = 1000;
        //}
        //(3)如果父类没有无参构造方法,可以指定调用有参构造方法
        public vip()
            : base("李四",4000)
        { debt =1000; }
        //有参构造方法
        //子类要对所有的字段完成赋值,显示调用父类的构造方法
        public vip(string name,decimal balance,decimal debt):base(name,balance)//父类的n个字段,自己的m个字段(m+n)(m)在对n个字段一一赋值
        {
            this.debt = debt;
        }
        //子类可以继承父类的方法,该对象直接使用
        //分析,存款操作,子类和父类完全一致,所以继承就可以
        
        
        //重写父类的方法cx():关键字 override
        public override void cx()
        {
            base.cx();//base关键字引用父类的对象,base.cx()就是调用父类的cx()方法
            //这样就为了,子类的该方法是在父类的方法基础上有新的内容
            //自定义子类新的功能,,所以现在大量的方法用继承来更新
            Console.WriteLine("您当前的透支额度为{0}元",debt);
        }
        

        //取款分析
        //(1)取款金额>余额+透支金额,不能完成操作
        //(2)取款金额>余额+透支金额,多余部分在透支额度里面减去
        // (3)取款金额<余额,余额=取款金额,透支额度不变
        //     分析结果,需要重写父类虚方法,子类方法要完全自定义
        public override void qk()
        {
            //询问
            Console.WriteLine("{0}用户要取多少钱",name);
            decimal amt = decimal.Parse(Console.ReadLine());
            //(1)取款金额>余额+透支金额,不能完成操作
            if (amt > balance + debt)
            {
                Console.WriteLine( "余额和透支额度不足,操作失败");
                return;
            }
            //(2)取款金额>余额+透支金额,多余部分在透支额度里面减去
            else if (amt > balance)
            {
                debt = debt + balance - amt;
            }
            // (3)取款金额<余额,余额=取款金额,透支额度不变
            else
            {
                balance -= amt;
            }
            Console.WriteLine("取款成功");
            //查询
            cx();
        }
        //子类还可以有自己的新方法--名字可以和父类不一样

        //5.28为了写入,要重写输出格式方法
        public override string ToString()
        {
            return name + "\t" + balance + "\t" + debt;
        }
   
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//打开系统流文件
using System.IO;
namespace 模拟银行_19_4_30
{
    class Program
    {
        //在主方法外部定义全局变量
        static Dictionary<string, vip> Ls = new Dictionary<string, vip>();//定义为静态就不用类来访问

        //static Dictionary<string,account> Is = new Dictionary<string, account>();

        static public string filePath = "d:\\vip.txt";//双斜线“\\”

        static void Main(string[] args)
        {
            ////5.28更新:1、多账户的存取--泛型--
            //一级菜单中的创建账户--循环--注意类型
            vip vi = null;
            //vip a=new vip("张三",3000,3000);
            //Ls.Add("张三",a);

            //vip b = new vip("李四", 4000, 4000);
            //Ls.Add("李四", b);

            //vip c = new vip("王五", 5000, 5000);
            //Ls.Add("王五",c);
            ////一级菜单中的登陆,二级菜单是对单个账户进行操作
            //if (Ls.ContainsKey("李四"))
            //{
            //    vi = Ls["李四"];
            //}
            //////提示:第一个pwd是字段,第二个是输入的密码
            //////&& :短路与,先判断第一个条件为假则后续不做(短路),满足再判断第二个条件
            ////if (Ls.ContainsKey(name)&&Ls[name].pwd==pwd)
            ////{
            ////    vi = Ls[name];
            ////        //显示二级菜单
            ////}
            
            
            ////2、存储到文件
            ////打开io流——创建文件流——创建写入器————遍历写入——关闭写入器和文件流
            ////创建文件流
            //FileStream fs = new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write);//(参数(至少写前两个):文件路径,文件打开模式filemode,文件的访问方式fileaccess,文件的共享方式fileshare)
            ////创建写入器
            //StreamWriter sw = new StreamWriter(fs);
            ////遍历集合把每一个对象写到文件中去
            //foreach (vip p in Ls.Values)//hash中key是name
            //{
            //    //每找到一个就写入
            //    sw.WriteLine(p.ToString());
            //}
            ////关闭写入器
            //sw.Close();
            ////关闭文件流
            //fs.Close();

            //3、从文件中读出来放到泛型里,重复的不能注册(故注释了)
            //实际应用中应该用循环来读取指定的name
            //创建文件流
            FileStream fs1 = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            //创建读入器
            StreamReader sr = new StreamReader(fs1);
            string data = sr.ReadLine();//定义个字符串
            string[] str;//字符串数组
            str = data.Split('\t');
            vi = new vip(str[0], decimal.Parse(str[1]), decimal.Parse(str[2]));
            //添加到泛型里面
            Ls.Add(str[0], vi);
            //关闭读入器
            sr.Close();
            //关闭文件流
            fs1.Close();

            //只能对一个账户处理
            //account vi=new account("张三",3000);
            //account vi = new account();
            //菜单--循环选择
            string choice;
            //vip vi=new vip();
            //vip vi=new vip("王五",5000,2000);
            while (true)
            {
              //界面
                Console.WriteLine("--------------------------------------------------------------------------------");
                Console.WriteLine("                       欢迎使用银行账户系统                                 ");
                Console.WriteLine("                                                                  版本:BetaV1.0");
                Console.WriteLine("--------------------------------------------------------------------------------");
                Console.WriteLine("                           请选择服务功能                                       ");
                Console.WriteLine("                           1.存钱                                               ");
                Console.WriteLine("                           2.取钱                                               ");
                Console.WriteLine("                           3.查询余额                                           ");
                Console.WriteLine("                           4.退出系统                                           ");
                Console.WriteLine("--------------------------------------------------------------------------------");
               //提示输入选择的数字
                Console.WriteLine("请选择操作的数字(1--3)");
                choice = Console.ReadLine();

                switch (choice)
                {
                    case "1": vi.ck(); break;
                    case "2": vi.qk(); break;
                    case "3": vi.cx(); break;
                    case "4": break;

                    default: Console.WriteLine("菜单选择错误");break;
                }
                if (choice=="4")
                {
                    Console.WriteLine("欢迎下次光临");
                    break;
                }
            }//循环结束
            //停止看结果
            Console.ReadLine();
        }
    }
}

 

posted @ 2024-04-09 21:21  困到很想醒  阅读(5)  评论(0编辑  收藏  举报