继承
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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构