重写和多态

重写

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 变量和对象都有类型,所以有多态。

posted @ 2020-03-10 15:51  翱翔的猴子  阅读(520)  评论(0编辑  收藏  举报