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元以上取款

  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/streetpasser/p/2793080.html
Copyright © 2011-2022 走看看