• 多态


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 多态
    {
        class Program
        {
            static void Main(string[] args)
            {
                //员工9点打卡, 经理11点打卡,程序员不打卡
                Employee emp = new Employee();
                emp.Daka();
                Manager man = new Manager();
                man.Daka();
                Programer pro = new Programer();
                pro.Daka();
    
                Console.WriteLine();
                //和上面的一样
                Employee[] emps = { emp, man, pro };
                for (int i = 0; i < emps.Length;i++ )
                {
                    if(emps[i] is Manager)
                    {
                        ((Manager)emps[i]).Daka();
                    }
                    else if(emps[i] is Programer)
                    {
                        ((Programer)emps[i]).Daka();
                    }
                    else
                    {
                        emps[i].Daka();
                    }
                }
    
                    Console.ReadKey();
    
            }
    
        }
    
        class Employee
        {
            public void Daka()
            {
                Console.WriteLine("9点打卡");
            }
        }
    
        class Manager:Employee
        {
            public void Daka()
            {
                Console.WriteLine("11点打卡");
            }
        }
    
        class Programer:Employee
        {
            public void Daka()
            {
                Console.WriteLine("不打卡");
            }
        }
    }
    

      

    可见上述方式造成了很大的代码冗余

    为了减少代码冗余,我们使用虚方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 多态
    {
        class Program
        {
            static void Main(string[] args)
            {
                //员工9点打卡, 经理11点打卡,程序员不打卡
                Employee emp = new Employee();
                emp.Daka();
                Manager man = new Manager();
                man.Daka();
                Programer pro = new Programer();
                pro.Daka();
    
                Console.WriteLine();
                //和上面的一样
                Employee[] emps = { emp, man, pro };
                for (int i = 0; i < emps.Length;i++ )
                {
                    //if(emps[i] is Manager)
                    //{
                    //    ((Manager)emps[i]).Daka();
                    //}
                    //else if(emps[i] is Programer)
                    //{
                    //    ((Programer)emps[i]).Daka();
                    //}
                    //else
                    //{
                    //    emps[i].Daka();
                    //}
                    emps[i].Daka();
                }
    
                    Console.ReadKey();
    
            }
    
        }
    
        class Employee
        {
            public virtual void Daka()
            {
                Console.WriteLine("9点打卡");
            }
        }
    
        class Manager:Employee
        {
            public override void Daka()
            {
                Console.WriteLine("11点打卡");
            }
        }
    
        class Programer:Employee
        {
            public override void Daka()
            {
                Console.WriteLine("不打卡");
            }
        }
    }
    

     运行结果同上面一样

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 多态
    {
        class Program
        {
            static void Main(string[] args)
            {
                //员工9点打卡, 经理11点打卡,程序员不打卡
                Employee emp = new Employee();
                emp.Daka();
                Manager man = new Manager();
                man.Daka();
                Programer pro = new Programer();
                pro.Daka();
    
                Console.WriteLine();
                //和上面的一样
                Employee[] emps = { emp, man, pro };
                for (int i = 0; i < emps.Length;i++ )
                {
                    //if(emps[i] is Manager)
                    //{
                    //    ((Manager)emps[i]).Daka();
                    //}
                    //else if(emps[i] is Programer)
                    //{
                    //    ((Programer)emps[i]).Daka();
                    //}
                    //else
                    //{
                    //    emps[i].Daka();
                    //}
                    emps[i].Daka();
                    emps[i].Say();
                }
    
                //抽象类不能创建对象
                //Person per = new Person();
                
                Console.ReadKey();
    
            }
    
        }
    
        abstract class Person
        {
            //抽象类不能创建对象
            //抽象类中可以含有字段、实函数和虚函数
            public string Name { get; set; }
            public int Age { get; set; }
    
            public void Say()
            {
                Console.WriteLine("hello");
            }
    
            //虚函数,可以实现,可以不实现
            public virtual void Daka()
            {
                Console.WriteLine("virtual hello");
            }
        }
    
        class Employee:Person
        {
            //public override void Daka()
            //{
            //    Console.WriteLine("9点打卡");
            //}
            //没有实现时运行Person中的virtual hello
        }
    
        class Manager:Employee
        {
            public override void Daka()
            {
                Console.WriteLine("11点打卡");
            }
        }
    
        class Programer:Employee
        {
            public override void Daka()
            {
                Console.WriteLine("不打卡");
            }
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 多态
    {
        class Program
        {
            static void Main(string[] args)
            {
                //员工9点打卡, 经理11点打卡,程序员不打卡
                Employee emp = new Employee();
                emp.Daka();
                Manager man = new Manager();
                man.Daka();
                Programer pro = new Programer();
                pro.Daka();
    
                Console.WriteLine();
                //和上面的一样
                Employee[] emps = { emp, man, pro };
                for (int i = 0; i < emps.Length;i++ )
                {
                    //if(emps[i] is Manager)
                    //{
                    //    ((Manager)emps[i]).Daka();
                    //}
                    //else if(emps[i] is Programer)
                    //{
                    //    ((Programer)emps[i]).Daka();
                    //}
                    //else
                    //{
                    //    emps[i].Daka();
                    //}
                    emps[i].Daka();
                    emps[i].Say();
                }
    
                //抽象类不能创建对象
                //Person per = new Person();
                
                Console.ReadKey();
    
            }
    
        }
    
        abstract class Person
        {
            //抽象类不能创建对象
            //抽象类中可以含有字段、实函数和虚函数
            public string Name { get; set; }
            public int Age { get; set; }
    
            public void Say()
            {
                Console.WriteLine("hello");
            }
    
            //虚函数,可以实现,可以不实现
            public virtual void Daka()
            {
                Console.WriteLine("virtual hello");
            }
    
            //如果用户定义了自己的构造函数,而在子类继承时调用的是原先的默认的无参构造函数
            //因此要再定义一个无参的构造函数
            public Person(string name,int age)
            {
                this.Name = name;
                this.Age = age;
            }
    
            public Person()
            { }
        }
    
        class Employee:Person
        {
            //public override void Daka()
            //{
            //    Console.WriteLine("9点打卡");
            //}
            //没有实现时运行Person中的virtual hello
    
        }
    
        class Manager : Employee
        {
            public override void Daka()
            {
                Console.WriteLine("11点打卡");
            }
        }
    
        class Programer : Employee
        {
            public override void Daka()
            {
                Console.WriteLine("不打卡");
            }
        }
    }
    

      

     

  • 相关阅读:
    最小树形图 朱刘算法模板+建边技巧
    模板倍增LCA 求树上两点距离 hdu2586
    【瞎搞题】gym226123 L. For the Honest Election
    【凸包板题】Gym
    集合3
    集合2
    集合1
    常用API&异常
    内部类&API
    多态&接口类&接口
  • 原文地址:https://www.cnblogs.com/my-cat/p/7612595.html
Copyright © 2020-2023  润新知