C#基础-----虚方法实现多态

虚方法:用virtual修饰的方法叫做虚方法

虚方法可以在子类中通过override关键字来重写

常见的虚方法:ToString().      Equals


虚方法特点总结:

1,在父类中把需要设置为虚方法的方法前加virtual标记;

2,虚方法在父类中必须有实现,哪怕是空实现

3,子类继承父类后,可以选择对虚方法进行重写也可以选择不进行重写;

4,当子类重写父类方法的时候,必须保证重写后的方法和原方法的访问修饰符,返回值类型,方法名,参数列表完全一致;

5,当方法的标记是virtual和override的时候都可以重写。


方法重写注意事项:

     子类重写父类方法时,必须与父类保持一致的方法签名与返回值类型。即:方法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致]
“方法签名”:一般是指方法的名称】+方法的参数列表,不包含方法返回值类型

虚方法与重写

1、方法不能用static修饰

2、方法重写与基类的签名必须一致

3virtual不能与private一起使用

4.虚方法为什么不能加static因为 虚方法是父类,static,那么就是类调用这个方法,和对象无关了,那子类就调不了,

base.Fun();的目的主要是添加逻辑


override与重载(overload)的区别

重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。

Override是进行基类中函数的重写。Override是面向对象的概念



虚方法实现多态

class Program
    {
        static void Main(string[] args)
        {
            #region 通过虚方法实现多态


            Person[] people = new Person[6];

            Chinese cn1 = new Chinese();
            Chinese cn2 = new Chinese();
            British br1 = new British();
            British br2 = new British();
            Japanese jp1 = new Japanese();
            American am1 = new American();
            people[0] = cn1;
            people[1] = cn2;
            people[2] = br1;
            people[3] = br2;
            people[4] = jp1;
            people[5] = am1;


            //开放封闭原则:对扩展开放,对修改封闭。
            for (int i = 0; i < people.Length; i++)
            {
                //因为Person类型中没有Show方法所以无法直接通过Person类型调用Show()方法。
                 //people[i].Show();


                #region 判断对象类型,进行转换,然后调用不同的方法。
                Chinese cn = (Chinese)people[i];
                cn.Show();

                if (people[i] is Chinese)
                {
                    Chinese cn = (Chinese)people[i];
                    cn.Show();
                }
                else if (people[i] is British)
                {
                    British uk = (British)people[i];
                    uk.Show();
                }
                else if (people[i] is Japanese)
                {
                    Japanese jp = (Japanese)people[i];
                    jp.Show();
                }
                #endregion

                //这句话体现了多态。。。。
                people[i].Show();


            //}
            //Console.ReadKey();

            #endregion
        }
    }

    public class Person
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public int Height { get; set; }

        //在Person类型中增加一个Show()方法。
        //第一步:将父类中的Show方法标记为virtual(虚方法)
        public virtual void Show()
        {
            //Console.WriteLine("Person 中的 Show方法。");
        }
    }

    //高丽
    public class Korean : Person
    {
        public override void Show()
        {
            Console.WriteLine("我是高丽人");
        }
    }

    /// 
    /// 朝鲜
    /// 
    public class NorthKorean : Korean
    {
        public override void Show()
        {
            Console.WriteLine("我是朝鲜人!!!!");
        }
    }



    public class American : Person
    {
        //当进行方法重写的时候,必须使用override关键字。
        public override void Show()
        {
            Console.WriteLine("我是美国人!");
        }
    }

    /// 
    /// 中国人类
    /// 
    public class Chinese : Person
    {
        //重写父类中的方法(覆盖)override
        public override void Show()
        {
            Console.WriteLine("我是中国人");
        }
    }


    /// 
    /// 英国人类
    /// 
    public class British : Person
    {
        public override void Show()
        {
            Console.WriteLine("我是英国人");
        }
    }

    /// 
    /// 日本人类
    /// 
    public class Japanese : Person
    {
        public override void Show()
        {
            Console.WriteLine("我是日本人");
        }
    }


你可能感兴趣的:(C#基础)