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-------------