首页 > 其他分享 >继承

继承

时间:2024-04-09 21:37:02浏览次数:20  
标签:父类 Console 继承 子类 vip WriteLine balance

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

namespace x180821_汪敏_模拟银行_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 x180821_汪敏_模拟银行_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 x180821_汪敏_模拟银行_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();
        }
    }
}

 

标签:父类,Console,继承,子类,vip,WriteLine,balance
From: https://www.cnblogs.com/bky-wang/p/18124860

相关文章

  • 继承2
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacex180821_汪敏_19_5_7_继承作业{publicclasschinese:person//定义一个chinese派生类,继承自person类{publicstringshengxiao;//生肖public......
  • CSS -层叠性、继承性、盒子模型、盒子模型表格、盒子模型margin、盒子阴影
    层叠性CSS层叠性(Cascading)是指在网页中应用多个样式规则时,根据一定的规则来确定最终应用的样式。层叠性使得样式可以按照一定的优先级和规则进行组合和覆盖,从而实现对元素的样式控制。层叠性的影响因素:选择器的特殊性(Specificity):选择器的特殊性决定了样式规则的优先级。......
  • Java——继承(含习题)
    继承的概念定义面向对象的继承,指在由一般类和特殊类形成的“一般-特殊”之间的类结构中,把一般类和所有特殊类都共同具有的属性和操作一次性地在一般类中进行定义,特殊类不再重复定义一般类已经定义的属性和操作,特殊类自动拥有一般类(以及所有更上层的一般类)定义的属性和操作......
  • C++继承之protected继承
    1概述  通过继承机制,可以利用已有的对象类型来定义新对象类型。所定义的新对象类型不仅仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。。2对象访问作用域作用域:publi......
  • C++ Note 继承指向
    引自:https://blog.csdn.net/baidu_35679960/article/details/80812527引自:https://blog.csdn.net/qq_21989927/article/details/111226696引自:https://www.runoob.com/cplusplus/cpp-polymorphism.html 为什么父类指针可以指向子类实例:可以通俗的理解,子类可能含有一些父类没......
  • C++:类的继承
    基类的构造函数和析构函数不会被继承,但是当子类对象初始化时则会自动调用基类的构造函数和析构函数(默认)如果想要调用基类的重载构造函数,需要在构造函数后加上“:<重载的构造函数>{};”,如下classFATHER{public:FATHER();~FATHER();FATHER(inta)//重载......
  • C++核心编程:多继承
    #include<iostream>usingnamespacestd;//多继承语法继承方式父类1,继承方式父类2//实际开发过程中,一般不建议使用多继承classBase1{public: Base1() { m_A=100; } intm_A;};classBase2{public: Base2() { m_A=200; } intm_A;};cl......
  • Java中的继承
    一、继承1.1为什么需要继承在写代码过程中两个类之间可能存在大量重复的代码,如何把这些重复的代码提取出来简化代码呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。1.2继承的概念 继承(inheritance):是面向对象程序设计使代码可以复用的最重要......
  • 1600. 王位继承顺序
    题面核心思想纯模拟!没反应过来是前序遍历~privateMap<String,List<String>>children;表示一个人的孩子当调用getInheritanceOrder时通过map搜索答案,由于孩子也有可能有孩子,无限套娃,所以通过递归搜索建立答案。建立答案的时候也不用考虑是否死亡,我们搜索完成后在去删除......
  • python面向对象(二)继承:最直接的代码复用
    继承简介继承是指通过在创建类时提供另一个类(称为父类)的名称,来获取父类的属性与方法。继承最明显的作用就是节约代码量,不需要重复定义已经存在的属性与方法。但是深入思考就会发现,复用只是继承的附带作用,继承最有意义的一点,是将不同的类联系了起来,让不同的类之间能够有一定的共性......