C#语言入门详解(刘铁锰)---重写与多态

C#语言入门详解(刘铁锰)视频教程:https://www.bilibili.com/video/BV1wx411K7rb

IDE:VS2015,  .NET Framework4.5.2

IDE:VS2019, .NET Core 3.1

同一代码以上两种环境均可运行。

1. 重写

类定义中,尽量避免对父类成员的隐藏。应使用virtual-override 重写父类成员。

子类可以重写父类中的非privatede 属性和方法。

Note方法签名由方法的名称、类型形参的个数和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。

2. 多态(polymorphism)

多态基于重写机制

类可以声明虚的方法、属性和索引器,而派生类可以重写这些函数成员的实现。这使类展示出“多态性行为”特征,也就是说,同一个函数成员调用所执行的操作可能是不同的,这取决于用来调用该函数成员的实例的运行时类型。

实例1:子类中隐藏式定义父类同名方法

隐藏式定义: 子类定义与父类具有相同参数、相同返回值的同名方法。示例如下:

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

namespace _2021._8._20_重写与多态
{
    class Program
    {
        static void Main(string[] args)
        {
            //test1
            Console.WriteLine("-----------test1-----------");
            //类实例化
            Vehicle vehicle1 = new Vehicle();
            Car car1 = new Car();
            RaceCar raceCar1 = new RaceCar();
            vehicle1.Run();
            car1.Run();
            raceCar1.Run();
            Console.WriteLine();

            //test2
            Console.WriteLine("-----------test2-----------");
            //用子类实例化父类
            Vehicle vehicle2 = new Car();          
            Car Car2 = new RaceCar();
            vehicle2.Run();
            Car2.Run();

            Console.WriteLine("-----------Done-----------");
        }
    }

   ///
   ///定义父类Vehicle及其子类Car, Car的子类RaceCar。
   ///每个类中均有同名方法:public void Run()
   ///

   //父类Vehicle
    class Vehicle
    {
        public void Run()
        {
            Console.WriteLine("(Vehicle) is running");
        }
    }

    //Vehicle的子类Car
    class Car : Vehicle
    {       
        public void Run()
        {
            Console.WriteLine("(Car) is Runing");
        }
    }

    //Car的子类RaceCar
    class RaceCar:Car
    {
        public void Run()
        {
            Console.WriteLine("(RaceCar) is Runing");
        }
    }

}

-----------test1-----------
(Vehicle) is running
(Car) is Runing
(RaceCar) is Runing

-----------test2-----------
(Vehicle) is Runing
(Car) is Runing
-----------Done-----------
请按任意键继续. . .

 

实例2:子类中重写(virtual-override)父类同名方法

父类中方法声明时使用virtual修饰,例如:public virtual void Run() 。在子类中使用override对同一方法进行重写,例如:public override void Run()示例如下

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

namespace _2021._8._20_重写与多态
{
    class Program
    {
        static void Main(string[] args)
        {
            //test1
            Console.WriteLine("-----------test1-----------");
            //类实例化
            Vehicle vehicle1 = new Vehicle();
            Car car1 = new Car();
            RaceCar raceCar1 = new RaceCar();
            vehicle1.Run();
            car1.Run();
            raceCar1.Run();
            Console.WriteLine();

            //test2
            Console.WriteLine("-----------test2-----------");
            //用子类实例化父类
            Vehicle vehicle2 = new Car();          
            Car Car2 = new RaceCar();
            vehicle2.Run();
            Car2.Run();

            Console.WriteLine("-----------Done-----------");
        }
    }

    //父类Vehicle
    class Vehicle
    {
        
        public virtual void Run()
        {
            Console.WriteLine("(Vehicle) is running");
        }
    }

    //Vehicle的子类Car
    class Car : Vehicle
    {

        public override void Run()
        {
            Console.WriteLine("(Car) is Runing");
        }
    }

    //Car的子类RaceCar
    class RaceCar :Car
    {

        public override void Run()
        {
            Console.WriteLine("(RaceCar) is Runing");

        }
    }
}

-----------test1-----------
(Vehicle) is running
(Car) is Runing
(RaceCar) is Runing

-----------test2-----------
(Car) is Runing
(RaceCar) is Runing
-----------Done-----------
请按任意键继续. . .

实例3:子类中重写(virtual-override)父类同名属性

Vehicle的子类Car重写Vehicle中的属性Speed  。示例代码如下:

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

namespace _2021._8._20_重写父类属性
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("-------------test-------------");
            Vehicle vehicle1 = new Vehicle();
            Car car1 = new Car();
            vehicle1.Run();
            car1.Run();
            Console.WriteLine("-------------Done-------------");
        }
    }

    //父类Vehicle
    class Vehicle
    {
        private int _speed; //速度

        public virtual int Speed
        {
            get { return _speed; }
            set { _speed = value; }
        }

        public virtual void Run()
        {
            this._speed = 100;
            Console.WriteLine("(Vehicle) is running on speed {0} km/h", this.Speed);
        }
    }

    //Vehicle的子类Car
    class Car : Vehicle
    {
        private int _rpm; //转速

        public override int Speed
        {
            //--------VS自动生成的代码---------
            //get
            //{
            //    return base.Speed;
            //}

            //set
            //{
            //    base.Speed = value;
            //}
            
            //---------自己重写的代码-----------
            get { return _rpm / 100; }
            set { _rpm = value * 100; }
        }

        public override void Run()
        {
            this._rpm = 5000;
            Console.WriteLine("(Car) is Runing on speed {0} km/h", this.Speed);
        }
    }

}

-------------test-------------
(Vehicle) is running on speed 100 km/h
(Car) is Runing on speed 50 km/h
-------------Done-------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值