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("我是高丽人");
        }
    }

    /// <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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值