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

1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法。(重写可以改变方法的指针)

如果需要改变类型指针,那么需要做方法的重写:

1.如果子类方法是重写方法,那么系统会扫描父类方法中,有没有相同签名的可重写方法,如果没有就报错。

2.如果父类方法是虚方法,那么子类可以选择是否重写,如果重写,就会调用子类的重写方法,实现多态;如果没有重写,就会使用父类已经实现的方法。

3.实现多态需要实现方法的重写

3.实现重写得实现类的继承

多态的使用:申明父类变量,实例化子类对象。

多态:一种操作,多种响应。

 

实现多态的思路:

1.先创建好父类,在创建好子类;

2.在父类中创建需要被重写的虚方法或者抽象方法

3.在子类中重写父类的虚方法或者抽象方法

4.申明父类类型的变量,实例化子类对象---写出通用代码;

 

1.声明父类变量,实例化子类对象  如:Person per=new Student()

2.以父类作为方法的返回值类型,返回具体的子类对象---(简单工厂,封装变化点);

3,父类作为参数,传入具体的子类对象;

 

 

父类People

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

namespace 多态的实现
{
    class People
    {
        #region ID
        int id;

        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        #endregion

        #region Name
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        #endregion

        #region Age
        int age;

        public int Age
        {
            get
            {
                //如果年龄大于0小于等于100,就返回,否则返回18岁
                if (age > 0 && age <= 100)
                {
                    return age;
                }
                else
                {
                    return 18;
                }
            }
            set
            {
                if (value > 0 && value <= 100) //注意这里不是: if(age>0&&age<=100)
                {
                    age = value;
                }
                else
                {
                    age = 18;
                }
            }
        }
        #endregion

        #region Sex
        string sex;

        public string Sex
        {
            get
            {
                //如果性别是男,或者女,就返回相应值,否则就设置为人妖
                if (sex == "" || sex == "")
                {
                    return sex;
                }
                else
                {
                    return "人妖";
                }
            }
            set
            {
                if (value == "" || value == "")
                {
                    sex = value;
                }
                else
                {
                    sex = "人妖";
                }
            }
        }
        #endregion

        public virtual void Show()
        {
            Console.WriteLine("我是父类People的Show方法");
        }

    }
}

 

子类Student

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

namespace 多态的实现
{
    /// <summary>
    /// 
    /// </summary>
    class Student : People   //实现多态必须要实现方法的重写,实现重写,必须要实现继承
    {
        public override void Show()
        {

             Console.WriteLine("我是Student类的Show方法");
        }
        //public override void Show()
        //{
        //    //方法重写默认是,调用父类的同名方法
        //    base.Show();
        //}
    }
}

 

子类Teacher

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

namespace 多态的实现
{
    class Teacher:People  //实现多态必须要实现方法的重写,实现重写,必须要实现继承
    {
        override public void Show()
        {
            Console.WriteLine("我是teacher类的Show方法");
        }
    }
}

 

 测试:

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

namespace 多态的实现
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建父类变量
            People[] p = new People[2];

            //实例化子类对象
            p[0] = new Student();
            p[1] = new Teacher();
            
            //写出通用代码
            p[0].Show();
            p[1].Show();
            Console.ReadKey();
        }
    }
}

 

 

例子2:

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

namespace 多态的练习
{
    class Animal
    {
        public virtual void GetFood()
        { 
           //虚方法往往不知道,怎么实现。
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class LaoYing:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("老鹰靠俯冲捕食。");
            //base.GetFood();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class Snack:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("蛇靠偷袭捕食");
            //base.GetFood();  //虚方法提供了默认实现,就是调用父类的方法
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多态的练习
{
    class Program
    {
        static void Main(string[] args)
        {
            //实现多态的步骤
            //1.先写好父类,和可以被重写的方法
            //2.写好子类,重写父类的方法
            //3.声明父类变量,实例化子类对象

            Animal[] ans = new Animal[2];
            ans[0] = new Snack();
            ans[1] = new LaoYing();

            foreach (var item in ans)
            {
                item.GetFood();
            }
            Console.ReadKey();
        }
    }
}

结果是:

 

转载于:https://www.cnblogs.com/caofangsheng/p/4513432.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值