zoukankan      html  css  js  c++  java
  • 继承(对象生命周期) + 覆盖[new](索引函数) + 重载[virtual/override]

    继承(对象生命周期)

    * 如下程序, 注意基类和派生类 构造方法 和 析构函数的 调用顺序

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApp
    {
        class lifecycle
        {
            public static void Main()
            {
                son sn = new son();
                System.GC.Collect();  //垃圾收集, 调用析构函数
            }
        }
    
        public class grandsire
        {
            public grandsire()
            {
                Console.WriteLine("调用grandsire构造函数");
            }
    
            ~grandsire()
            {
                Console.WriteLine("调用grandsire析构函数");
            }
        }
    
        public class father : grandsire
        {
            public father()
            {
                Console.WriteLine("调用father构造函数");
            }
    
            ~father()
            {
                Console.WriteLine("调用father析构函数");
            }
        }
    
        public class son : father
        {
            public son() //隐式调用基类构造函数 相当于public son():base(),但若基类构造函数带参数则派生类不能自动继承,必须显式调用
            {   //eg: 基类构造函数:public contact(string name){...}, 则派生时public Family(string name):base(name){...}
                Console.WriteLine("调用son构造函数");
                System.GC.Collect();
            }
    
            ~son()
            {
                Console.WriteLine("调用son析构函数");
            }
        }
    }
    

    结果:

    调用grandsire构造函数
    调用father构造函数
    调用son构造函数
    调用son析构函数
    调用father析构函数
    调用grandsire析构函数

    //------------------------------------------------------------------------------------------

    覆盖[new]

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApp
    {
        class InheritSample
        {
            public static void Main()
            {
                //继承
                business c1 = new business();
                c1.Name = "赵丽";
                c1.title = "经理";
                c1["办公电话"] = "010-1234567";
                c1["传真"] = "888888";
                c1.Output();
                Console.WriteLine(" ");
    
                Family c2 = new Family();
                c2.Name = "王强";
                c2.Relation = "表弟";
                c2.Output();
    
                Console.Read();
            }
        }
    
        public class Contact
        {
            //protected 确保可以被派生类访问
            protected string m_name;
            protected string m_homePhone = "未知";
            protected string m_busiPhone = "未知";
            protected string m_mobilePhone = "未知";
    
            public string Name
            {
                get { return m_name; }
                set { m_name = value; }
            }
    
            public string this[string phoneType]  //带参数分支的属性  索引函数
            {
                get
                {
                    switch (phoneType)
                    {
                        case "住宅电话":
                            return m_homePhone;
                        case "办公电话":
                            return m_busiPhone;
                        case "手机":
                            return m_mobilePhone;
                        default:
                            return null;
                    }
                }
                set
                {
                    switch (phoneType)
                    {
                        case "住宅电话":
                            m_homePhone = value;
                            break;
                        case "办公电话":
                            m_busiPhone = value;
                            break;
                        case "手机":
                            m_mobilePhone = value;
                            break;
                        default:
                            break;
                    }
                }
            }
    
            public void Output()
            {
                Console.WriteLine("姓名:{0}", m_name);
                Console.WriteLine("住宅电话:{0}", m_homePhone);
                Console.WriteLine("办公电话:{0}", m_busiPhone);
                Console.WriteLine("手机:{0}", m_mobilePhone);
            }
        }
    
        public class business : Contact
        {
            protected string m_busiFax = "未知";
            protected string m_title = "女士/先生";
    
            public string title
            {
                get { return m_title; }
                set { m_title = value; }
            }
    
            ////1. new 覆盖基类方法
            public new void Output()
            {
                Console.WriteLine("{0} {1}", m_name, m_title);
                Console.WriteLine("办公电话:{0} 手机:{1}", m_busiPhone, m_mobilePhone);
                Console.WriteLine("传真:{0}", m_busiFax);
            }
    
            //2. new 覆盖基类的索引函数
            public new string this[string phoneType]
            {
                //get
                //{
                //    switch (phoneType)
                //    {
                //        case "住宅电话":
                //            return m_homePhone;
                //        case "办公电话":
                //            return m_busiPhone;
                //        case "传真":
                //            return m_busiFax;
                //        case "手机":
                //            return m_mobilePhone;
                //        default:
                //            return null;
                //    }
                //}
                //set
                //{
                //    switch (phoneType)
                //    {
                //        case "住宅电话":
                //            m_homePhone = value;
                //            break;
                //        case "办公电话":
                //            m_busiPhone = value;
                //            break;
                //        case "传真":
                //            m_busiFax = value;
                //            break;
                //        case "手机":
                //            m_mobilePhone = value;
                //            break;
                //        default:
                //            break;
                //    }
                //}
    
                //使用base访问基类成员 , 从而简化为↓ 
                get
                {
                    switch (phoneType)
                    {
                        case "传真":
                            return m_busiFax;
                        default:
                            return base[phoneType];
                    }
                }
                set
                {
                    switch (phoneType)
                    {
                        case "传真":
                            m_busiFax = value;
                            break;
                        default:
                            base[phoneType] = value;
                            break;
                    }
                }
    
            }
        }
    
        public class Family : Contact
        {
            protected string m_relation;
            protected DateTime m_birthday;
    
            public string Relation
            {
                get { return m_relation; }
                set { m_relation = value; }
            }
    
            public DateTime Birthday
            {
                get { return m_birthday; }
                set { m_birthday = value; }
            }
    
    
            ////1. new 覆盖基类方法
            public new void Output()
            {
                Console.WriteLine("{0} {1}", m_name, m_relation);
                Console.WriteLine("住宅电话:{0}", m_homePhone);
                Console.WriteLine("办公电话:{0} 手机:{1}", m_busiPhone, m_mobilePhone);
            }
        }
    }
    

    结果:

    赵丽 经理
    办公电话:010-1234567 手机:未知
    传真:888888

    王强 表弟
    住宅电话:未知
    办公电话:未知 手机:未知

    //------------------------------------------------------------------------------------------

    重载[virtual/override]

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApp
    {
        class virtualInheritSample
        {
            public static void Main()
            {
                DerivedClass c = new DerivedClass();
                c.Call();
                Console.Read();
            }
        }
    
        public class BaseClass
        {
            public void A()
            {
                Console.WriteLine("调用基类方法A");
            }
    
            public virtual void B()
            {
                Console.WriteLine("调用基类方法B");
            }
        }
    
        public class DerivedClass : BaseClass
        {
            public new void A()
            {
                Console.WriteLine("调用派生类方法A");
            }
    
            public override void B()
            {
                Console.WriteLine("调用派生类方法B");
            }
    
            public void Call()
            {
                this.A();
                this.B();
                ((BaseClass)this).A();  //强制转为基类对象
                ((BaseClass)this).B();  //调用基类虚函数 即调用其派生
            }
        }
    
    }
    

     结果:

    调用派生类方法A
    调用派生类方法B
    调用基类方法A
    调用派生类方法B

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApp
    {
        class ATM_overrideSample
        {
            public static void Main()
            {
                BankCard[] cards = new BankCard[3];
                cards[0] = new BankCard();
                cards[1] = new ForeignBankCard();
                cards[2] = new LimitBankCard();
                foreach (BankCard card in cards)
                {
                    card.Deposit(5000);
                    card.Withdraw(2000);
                }
    
                Console.Read();
            }
        }
    
        public class BankCard
    
        {
            protected decimal m_amount;
            public virtual void Deposit(decimal x)
            {
                m_amount += x;
                Console.WriteLine("--------------------------------");
                Console.WriteLine("存款{0}元,余额{1}元", x, m_amount);
            }
    
            public virtual void Withdraw(decimal x)
            { 
                if(m_amount>x)
                { 
                    m_amount -= x;
                    Console.WriteLine("取款{0}元,余额{1}元",x,m_amount);
                }
                else
                {
                    Console.WriteLine("余额不足");
                }
            }
        }
    
        public class ForeignBankCard : BankCard
        {
            public override void Withdraw(decimal x)
            {
                decimal fee = x * 0.01M;
                if (m_amount > x + fee)
                {
                    m_amount -= (x + fee);
                    Console.WriteLine("取款{0}元,手续费{1}元,余额{2}元", x, fee, m_amount);
                }
                else
                {
                    Console.WriteLine("余额不足");
                }
            }
        }
    
        public class LimitBankCard : BankCard
        {
            public override void Withdraw(decimal x)
            {
                if (x >= 1000)
                {
                    Console.WriteLine("对不起,此卡限制1000元以上取款");
                }
                else
                {
                    base.Withdraw(x);
                }
            }
        }
    }
    

     结果:

    --------------------------------
    存款5000元,余额5000元
    取款2000元,余额3000元
    --------------------------------
    存款5000元,余额5000元
    取款2000元,手续费20.00元,余额2980.00元
    --------------------------------
    存款5000元,余额5000元
    对不起,此卡限制1000元以上取款

  • 相关阅读:
    pytest框架
    Zabbix第九章(zabbix自定义item)
    Zabbix第七章(Zabbix监控本地)
    Zabbix第五章(配置zabbix的语言)
    Zabbix第四章(zabbix-server安装)
    Zabbix第二章(下载)
    Zabbix第一章(简介)
    线性筛
    Eratosthenes筛法
    质数判定
  • 原文地址:https://www.cnblogs.com/streetpasser/p/2793080.html
Copyright © 2011-2022 走看看