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

来源:互联网 发布:ubuntu 怎么进入u盘 编辑:程序博客网 时间:2024/04/30 06:47

虚方法:用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("我是高丽人");        }    }    /// <summary>    /// 朝鲜    /// </summary>    public class NorthKorean : Korean    {        public override void Show()        {            Console.WriteLine("我是朝鲜人!!!!");        }    }    public class American : Person    {        //当进行方法重写的时候,必须使用override关键字。        public override void Show()        {            Console.WriteLine("我是美国人!");        }    }    /// <summary>    /// 中国人类    /// </summary>    public class Chinese : Person    {        //重写父类中的方法(覆盖)override        public override void Show()        {            Console.WriteLine("我是中国人");        }    }    /// <summary>    /// 英国人类    /// </summary>    public class British : Person    {        public override void Show()        {            Console.WriteLine("我是英国人");        }    }    /// <summary>    /// 日本人类    /// </summary>    public class Japanese : Person    {        public override void Show()        {            Console.WriteLine("我是日本人");        }    }


0 0
原创粉丝点击