重写
using System;
namespace Test1
{
class Program
{
static void Main(string[] args)
{
Vehicle car = new Car();//可以用父类类型变量去引用一个子类的实例
car.Run();
}
public class Vehicle
{
public virtual void Run()
{
Console.WriteLine("i am running");
}
}
class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("car am running");
}
}
}
}
隐藏
如果把父类的virtal和子类的override抹去,那么子类就没有重写父类的版本,子类的版本隐藏,父子类没有重写关系
重写与隐藏发生的条件:
1.函数成员(常用的是方法和属性)
2.可见(public和protected 访问级别)
3.签名一致(参数一致,属性名,方法名)
多态
基于重写机制(virtual->override)
函数成员的具体行为由对象决定,调用最新的版本。
C#语言无论是对象还是变量都有类型,所以会产生代差。
子类的类型可以赋值给一个父类类型的变量,但是到过来不行,即父类类型的实例赋值给子类类型的变量。
补充
python对象是有类型的,变量没有类型,python重写看不到多态的效果,因为对象是什么类型,输出的赋值的变量就是什么类型。
javascript也是一样,不支持强类型(变量无类型),可以重写,但是没有多态。
Typescript 变量和对象都有类型,所以有多态。