C#学习笔记之多态虚方法

多态概念:让一个对象能够表现多种状态(类型)
实现多态的手段;1、虚方法 2、抽象类,3、接口
1、虚方法将父类的方法标记为虚方法使用关键字virtual,这个方法可以被子类重写一遍

虚方法:将子类父类的方法标记为虚方法用关键字:virtual。这个函数可以被子类重写override

使用需方法最主要的是找出父类

                                                      代码分析

1.不适用虚方法时

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

namespace _01201多态
{
    class Program
    {
        static void Main(string[] args)
        {
            Person m1 = new Person("Person");
            Person m2 = new Person("People");
            Chinese m3 = new Chinese("孔子");
            Chinese m4 = new Chinese("孟子");
            Japanese m5 = new Japanese("竹下俊");
            Japanese m6 = new Japanese("春上数");
            Russians m7 = new Russians("诺维斯基");
            Russians m8 = new Russians("高尔基");
            American m9 = new American("凯蒂派里");
            American m10 = new American("范迪塞尔");
            Person[] per = {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10};//里式转换法
            for (int i = 0; i < per.Length ; i++)
            {
                //per[i].PrintInfo();
                if (per[i] is American)
                {
                    ((American)per[i]).PrintInfo();
                }
                else if (per[i] is Chinese)
                {
                    ((Chinese)per[i]).PrintInfo();
                }
                else if (per[i] is Russians)
                {
                    ((Russians)per[i]).PrintInfo();
                }
                else if (per[i] is Japanese)
                {
                    ((Japanese)per[i]).PrintInfo();
                }
                else
                {
                    per[i].PrintInfo();
                }
            }
            Console.ReadKey();




        }
    }
    class Person
    {
        private string _name;       //私有字段      

        public string Name          //字段的属性
        {
            get { return _name; }
            set { _name = value; }
        }
        public void PrintInfo()        //打印信息的方法
        {
            Console.WriteLine("我是人类\t我叫{0}", this.Name);
        }
        public Person(string name)     //有参构造函数
        {
            this.Name = name;
        }

    }
    class Chinese : Person
    {
        public void PrintInfo()//打印信息的方法与父类重名
        {
            Console.WriteLine("我是中国人\t我叫{0}", this.Name);

        }
        public Chinese(string name) //Chinese类的构造函数显示的调用父类的有参构造函数 
            : base(name)
        {

        }

    }
    class American : Person
    {
        public void PrintInfo()
        {
            Console.WriteLine("我是美国人\t我叫{0}", this.Name);//打印信息的方法
        }
        public American(string name)//有参构造函数显式的调用父类的有参构造函数
            : base(name)
        {

        }
    }
    class Japanese : Person
    {
        public void PrintInfo()//打印信息的方法,和父类重名
        {
            Console.WriteLine("我是日本人\t我叫{0}", this.Name);
        }
        public Japanese(string name)//有参构造函数显式的调用父类的有参构造函数
            : base(name)
        {

        }
    }
    class Russians : Person
    {
        public void PrintInfo()
        {
            Console.WriteLine("我是俄罗斯人\t我叫{0}",this.Name);
        }
        public Russians(string name)
            : base(name)
        { 
        }
    }
}

使用多态虚方法后可以减少代码量

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

namespace _01202多态
{
    class Program
    {
        static void Main(string[] args)
        {
            Person m1 = new Person("Person");
            Person m2 = new Person("People");
            Chinese m3 = new Chinese("孔子");
            Chinese m4 = new Chinese("孟子");
            Japanese m5 = new Japanese("竹下俊");
            Japanese m6 = new Japanese("春上数");
            Russians m7 = new Russians("诺维斯基");
            Russians m8 = new Russians("高尔基");
            American m9 = new American("凯蒂派里");
            American m10 = new American("范迪塞尔");
            Person[] per = { m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, new English("贝克汉姆"),new English("憨豆") };//里式转换法
            for (int i = 0; i < per.Length; i++)
            {
                per[i].PrintInfo();//这是的对象表现出多种状态
            }
            Console.ReadKey();


        }
    }
    class Person
    {
        private string _name;       //私有字段      

        public string Name          //字段的属性
        {
            get { return _name; }
            set { _name = value; }
        }
        public virtual void PrintInfo()        //打印信息的方法
        {
            Console.WriteLine("我是人类\t我叫{0}", this.Name);
        }
        public Person(string name)     //有参构造函数
        {
            this.Name = name;
        }

    }
    class Chinese : Person
    {
        public  override void PrintInfo()//打印信息的方法与父类重名
        {
            Console.WriteLine("我是中国人\t我叫{0}", this.Name);

        }
        public Chinese(string name) //Chinese类的构造函数显示的调用父类的有参构造函数 
            : base(name)
        {

        }

    }
    class American : Person
    {
        public override void PrintInfo()
        {
            Console.WriteLine("我是美国人\t我叫{0}", this.Name);//打印信息的方法
        }
        public American(string name)//有参构造函数显式的调用父类的有参构造函数
            : base(name)
        {

        }
    }
    class Japanese : Person
    {
        public override void PrintInfo()//打印信息的方法,和父类重名
        {
            Console.WriteLine("我是日本人\t我叫{0}", this.Name);
        }
        public Japanese(string name)//有参构造函数显式的调用父类的有参构造函数
            : base(name)
        {

        }
    }
    class Russians : Person
    {
        public override void PrintInfo()
        {
            Console.WriteLine("我是俄罗斯人\t我叫{0}", this.Name);
        }
        public Russians(string name)
            : base(name)
        {
        }
    }
    class English : Person
    {
        public English(string name)
            : base(name)
        {
 
        }
        public override void PrintInfo()
        {
            Console.WriteLine("我是英国人\t我叫{0}",this.Name);
        }
    }
}
运行结果:

虚方法的练习:老板宣布开始工作,人事部全体成员开始工作,销售部全体成员开始工作,技术部全体成员开始工作

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

namespace _0120301多态虚方法练习
{
    class Program
    {
        static void Main(string[] args)
        {
            //boss 宣布上班
            //人事部开全体员工开始工作
            //销售部全体员工开始工作
            //技术部全体员工开始工作
            Boss b = new Boss();
            Boss pd = new PersonnalDepartment();//人事部
            Boss sd = new SalesDepartment();//销售部
            Boss td = new TechnicDepartment();//技术部
            b.StartWork();
            pd.StartWork();
            sd.StartWork();
            td.StartWork();
            Console.ReadKey();
            
        }
    }
    public class Boss
    {
        public virtual void StartWork()  // 父类的虚方法
        {
            Console.WriteLine("全体员工开始工作");
        }
    }
    public class PersonnalDepartment : Boss //人事部类
    {
        public override void StartWork()  //重写父类虚方法方法
        {
            Console.WriteLine("人事部全体成员开始工作");
        }

    }
    public class SalesDepartment : Boss  //销售部
    {
        public override void StartWork()  //重写父类虚方法方法
        {
            Console.WriteLine("销售部全体员工开始工作");
        }
    }
    public class TechnicDepartment : Boss //技术部类
    {
        public override void StartWork()  //重写父类虚方法方法
        {
            Console.WriteLine("技术部全体员工开始工作");
        }
    }
    
}

运行结果:





猜你喜欢

转载自blog.csdn.net/boy_of_god/article/details/80203964
今日推荐