C#多态实现之虚方法

本文探讨了C#编程中的多态概念,重点关注虚方法的使用。通过一个简单的People类实例,展示了如何在继承结构中利用虚方法实现多态行为,强调了封装和开放源代码在软件开发中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制台应用程序中,新建一个People类文件,代码如下:

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

namespace _13多态
{
    public class People
    {
        public People(string name)
        {
            this.Name = name;
        }
        public string Name
        {
            get;
            set;
        }

        //1.第一,将父类中的方法标记为“虚方法”:virtual
        //2.当一个方法是虚方法的时候,那么这个方法在子类中就可以被重写了。
        //子类继承父类以后,可以直接使用该方法,也可以将该方法重写
        public virtual void Show() 
        {
            Console.WriteLine("哈哈哈!");
        }
    }

    /// <summary>
    /// 中国人
    /// </summary>
    public class Chinese : People
    {
        public Chinese(string name)
            : base(name)
        {

        }
        //3.子类如果要重写父类方法,则需要在子类的Show方法前,加一个override关键字,且有且只有这一个表示重写的override关键字。
        public override void Show() 
        {
            Console.WriteLine("我叫:{0},我是中国人!!",Name);
        }
    }

    /// <summary>
    /// 日本人
    /// </summary>
    public class Japanese : People
    {
        public Japanese(string name)
            : base(name)
        {

        }
        public override void Show()
        {
            Console.WriteLine("我叫:{0},我是日本人!!", Name);
        }
    }

    /// <summary>
    /// 美国人
    /// </summary>
    public class American : People
    {
        public American(string name)
            : base(name)
        {

        }
        public override void Show()
        {
            Console.WriteLine("我叫:{0},我是美国人!!", Name);
        }
    }
    /// <summary>
    /// 英国人
    /// </summary>
    public class English : People
    {
        public English(string name)
            : base(name)
        {

        }
        public override void Show()
        {
            Console.WriteLine("我叫:{0},我是英国人!!", Name);
        }
    }

}


在主程序Program中使用,代码如下:

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

namespace _13多态
{
    //多态,即为多种表现形态;现实中就是事物的多种形态。在程序里,表现为父类的对象指向子类的实例,在调用方法时。调用的是子类重写的方法。
    //实现手段:虚方法、接口、抽象类
    //何时用多态??答:代码重用
    class Program
    {
        static void Main(string[] args)
        {
            //面向对象重要原则
            //对扩展开放,对修改关闭---开放封闭原则,扩展程序的同时不修改源代码
            //格式设置热键:Ctrl+K+D:全局;Ctrl+K+F:选中部分:局部。
            Chinese c1 = new Chinese("姚明");
            Japanese j1 = new Japanese("向井");
            American us1 = new American("T-Mac");
            //添加一个
            English en1 = new English("Tom");

            //父类类型指向子类类型,即为实现多态
            People p1 = new Chinese("刘翔");
            People p2 = new Japanese("松下");

            People[] cns = new People[] { c1, j1, us1, en1 };
            //遍历数组中的每个元素,调用每个元素的Show方法
            for (int i = 0; i < cns.Length; i++)
            {
                #region 第一种,只有三种国籍,还没有添加英国;旧版本
                //判断当前的cns[i]中存储的对象是否是Chinese类型
                if (cns[i] is Chinese)
                {
                    //强制转换
                    Chinese cn = (Chinese)cns[i];
                    cn.Show();
                }
                else if (cns[i] is Japanese)
                {
                    Japanese cn = (Japanese)cns[i];
                    cn.Show();
                }
                else if (cns[i] is American)
                {
                    American cn = (American)cns[i];
                    cn.Show();
                }
                #endregion

                #region 新版本
                //在父类中添加virtual虚Show方法,通过cns[i]调用父类中的“虚方法”,进行判,
                //如果子类重写了父类的Show方法,则调用子类的Show方法;否则调用父类的Show方法
                //即:如果cns[i]中存储的是Chinese类型,则调用Chinese的Show方法;
                //这就是多态的体现。
                cns[i].Show();
                #endregion
            }
            Console.WriteLine("ok");
            Console.ReadKey();
        }
    }
}

Demo下载地址 http://download.youkuaiyun.com/detail/zxcvbnm32123/5785153

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值