继承中的隐藏:(不要使用隐藏,语法没有错误但是开发项目时会被视为错误)

在继承类中完全保留基类中的函数名

//基类,交通工具
class Vehicle
{
public void Run()
{
Console.WriteLine("Vehicle Run");
}
}
//派生类,汽车
class Car : Vehicle
{
public void Run()
{
Console.WriteLine("Car RunRun");
}
}

隐藏之后,Car中的Run()有两个版本,一个是继承来的Run() 被隐藏,另一个是Car中新写的Run()。

两个版本共存,

如果引用类型是父类,实例类型是子类,调用隐藏方法,

如果引用类型是子类,实例类型也是子类,调用新写的方法,

继承中的重写:

基类中Run()函数前加”virtual “,virtual 在这里翻译为形式上的,名存实亡的,其实就是为以后override重写做铺垫

派生类中的Run()函数前加”override“。

//基类,交通工具
class Vehicle
{
public void virtual Run()
{
Console.WriteLine("Vehicle Run");
}
}
//派生类,汽车
class Car : Vehicle
{
public void override Run()
{
Console.WriteLine("Car Run");
}
}

重写之后,Car中的Run()方法只有一个版本,原来继承的Run()已经被新写的Run()覆盖。

在子类中仅存在一个版本,所以无论引用类型是父类还是子类,只要实例类型是子类,则调用的就是新写的方法。

举例说明:

hide:

Car类中更新Run()的新版本和旧版本共存,

但是我们用父类类型Vehicle作为引用的类型,

子类类型Car类做实例类型

就调用旧的版本(I‘m running.)

    class Program
{
static void Main(string[] args)
{
Vehicle car = new Car();//C#支持父类类型变量引用一个子类类型实例,is a. 一辆car是一个Vehicle
car.Run();
}
} class Vehicle
{
public void Run()
{
Console.WriteLine("I'm running");
}
} class Car : Vehicle
{
public void Run()
{
Console.WriteLine("Car is running");
}
}

结果是:

I‘m running.

直接Car car = new Car();才返回Car类中的新版本!

override:

重写一次Run()方法,即在Car类中更新Run()的新版本(Car is running.),旧的版本(I‘m running.)被重写(覆盖)

我们用父类类型Vehicle作为引用的类型,Car类做实例类型,

就调用新的版本(Car is running.)

    class Program
{
static void Main(string[] args)
{
Vehicle car = new Car();
car.Run();
}
} class Vehicle
{
public virtual void Run()
{
Console.WriteLine("I'm running");
}
} class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("Car is running");
}
}

结果是:

Car is running.

override:

添加RaceCar类再重写一次Run()方法,即在RaceCar类中更新Run()的新版本(RaceCar is running.)

我们用父类类型Car作为引用的类型,RaceCar类做实例类型,(我们用父类类型Vehicle作为引用的类型,RaceCar类做实例类型,结果也相同)

就调用新的版本(RaceCar is running.)

    class Program
{
static void Main(string[] args)
{
Car car = new RaceCar();//C#支持父类类型变量引用一个子类类型实例,is a. 一辆car是一个Vehicle
car.Run();
}
} class Vehicle
{
public virtual void Run()
{
Console.WriteLine("I'm running");
}
} class Car : Vehicle
{
public override void Run()
{
Console.WriteLine("Car is running");
}
} class RaceCar : Car
{
public override void Run()
{
Console.WriteLine("RaceCar is running");
}
}

结果是:

RaceCar is running.

以上代码回答了一个问题——什么是多态?

多态就是当我们用一个父类的变量,引用一个子类的实例,调用被重写的成员的时候,总是会调用到最新的版本(与实例类型相关联的版本)

为什么会出现多态的现象?

因为C#语言中,变量的类型和实例对象的类型,是可以不同的。比如:

Car car = new RaceCar();

变量car的类型是Car,实例类型是RaceCar。这样就有代差,可以用基类类型的变量引用子类类型实例,反之不可

最新文章

  1. webpack解惑:多入口文件打包策略
  2. MySQL Database on Azure新功能
  3. VS 常用高效 快捷键
  4. 安利一个MVC的好东西,RazorGenerator.MsBuild,可以自动编译cshtml文件
  5. Oracle 11g服务详细介绍及哪些服务是必须开启的?
  6. yum报错: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
  7. shell grep 高亮
  8. 如何在jmeter中调用自己写的java工具包
  9. 访问MySQL数据库时,报“找不到请求的 .net Framework 数据提供程序。可能没有安装。”的解决方案
  10. 转载:Struts2+Jquery实现ajax并返回json类型数据
  11. perl 获取文件内容里第一个AAA和最后一个AAA
  12. Please read “Security” section of the manual to find out how to run mysqld as root!错误解决(转)
  13. Python——文件操作详解
  14. spring Boot+spring Cloud实现微服务详细教程第一篇
  15. [Swift]LeetCode228. 汇总区间 | Summary Ranges
  16. 前向传播算法(Forward propagation)与反向传播算法(Back propagation)
  17. 【C语言 基础】什么流程控制?
  18. Hive简单编程实践-词频统计
  19. 【译】8. Java反射——注解
  20. Cocos2d-x for Windows Phone 用法总结

热门文章

  1. Application.mk语法解释(转)
  2. Cesium导出PDF
  3. ElasticSearch---初识
  4. leetcode-160场周赛-5238-找出给定方程的正整数解
  5. input select 值得绑定与获取
  6. go函数声明
  7. Java Number&Math类
  8. 密码学之RSA基础
  9. hive中分隔符‘\001’到底是什么鬼
  10. SP7258 SUBLEX - Lexicographical Substring Search(后缀自动机)