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

多态基础

多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
用通俗的语句来讲,多态是就是对于同一对象可以表现处多种状态,在调用该对象时可以根据具体的子类来进行调用
多态的好处就是能增加程序的扩展性,配合继承来说,可以让子类继承父类的同时,自己重写其方法,从而实现其方法的多态显示
理论讲解你可以不太理解,配合实例可能会更加透彻

实现多态的方法

实现多态的方法主要有三种:
1)虚方法
2)抽象类
3)接口

虚方法

虚方法就是将父类的方法标记为虚方法,使用关键字Virtual,从而可以使该函数能被子类重新定义(子类前加上关键字override),从而可以实现对方法的重新定义
因此,在调用不同的子类时,可以实现调用不同子类对象中的方法

虚方法实例

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

namespace _05多态
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 多态的引入

            Chinese cn1 = new Chinese("韩梅梅");
            Chinese cn2 = new Chinese("李雷");
            Japanese j1 = new Japanese("山本冈木");
            Japanese j2 = new Japanese("渡边一树");
            Korea k1 = new Korea("金秀贤");
            Korea k2 = new Korea("李钟硕");
            America a1 = new America("科比布莱恩特");
            America a2 = new America("特朗普");
            Person[] pers = { cn1, cn2, j1, j2, k1, k2, a1, a2 };
            for (int i = 0; i < pers.Length; i++)
            {
                pers[i].SayHello();//此时均为父类的函数
                //如果需要子类的函数
                if(pers[i] is Chinese)
                {
                    ((Chinese)pers[i]).SayHello();
                }
                else if(pers[i] is Japanese)
                {
                    ((Japanese)pers[i]).SayHello();
                }
                else if(pers[i] is Korea)
                {
                    ((Korea)pers[i]).SayHello();
                }
                else
                {
                    ((America)pers[i]).SayHello();
                }
            }
            Console.ReadKey();
            #endregion 
            //多态:让一个对象能够表现出多种的状态(类型)

        }
    }
    public class Person
    {
        string _name;

        public string Name { get => _name; set => _name = value; }
        public Person(string name)
        {
            this.Name = name;
        }
        public virtual void SayHello()
        {
            Console.WriteLine("我是人类");
        }
    }
    public class Chinese:Person
    {
        public Chinese(string name)
            :base(name)
        {

        }
        public override void SayHello()
        {
            Console.WriteLine("我是中国人,我叫{0}",this.Name);
        }
    }
    public class Japanese:Person
    {
        public Japanese(string name)
            :base(name)
        {

        }
        public override void SayHello()
        {
            Console.WriteLine("我是日本人,我叫{0}",this.Name);
        }
    }
    public class Korea:Person
    {
        public Korea(string name)
            :base(name)
        {

        }
        public override void SayHello()
        {
            Console.WriteLine("我是韩国人,我叫{0}",this.Name);
        }
    }
    public class America:Person
    {
        public America(string name)
            :base(name)
        {

        }
        public override void SayHello()
        {
            Console.WriteLine("我是美国人,我叫{0}",this.Name);
        }
    }
}


1)虚方法必须要有实现,哪怕是空实现

       //空实现
        public virtual void SayHello()
        {
            
        }

2)子类可以不加override,即不重写方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值