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

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

//基类,交通工具
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。这样就有代差,可以用基类类型的变量引用子类类型实例,反之不可

继承中的隐藏(hide)重写(Override)和多态(Polymorphism)的更多相关文章

  1. C++因继承引发的隐藏与重写

    在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段.通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指 ...

  2. C++继承引入的隐藏与重写

    在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段,是类型之间的关系建模.通过继承一个类,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指一个对象 ...

  3. [18/11/29] 继承(extends)和方法的重写(override,不是重载)

    一.何为继承?(对原有类的扩充) 继承让我们更加容易实现类的扩展. 比如,我们定义了人类,再定义Boy类就只需要扩展人类即可.实现了代码的重用,不用再重新发明轮子(don’t  reinvent  w ...

  4. 【C++】继承中的隐藏与覆盖

    没有访问控制符时默认为私有继承. 当基类中的某个函数有若干个重载版本,继承类中也实现了该函数的某个重载版本时,参数完全相同的基类版本被覆盖,基类的其他版本被隐藏. 1.若要在继承类中使用基类的被覆盖方 ...

  5. js---17继承中方法属性的重写

    function F(){}; var f = new F(); f.name = "cf"; f.hasOwnProperty("name");//true ...

  6. 关于在C#中对类中的隐藏基类方法和重写方法的理解

    最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类 ...

  7. 重载(overload),覆盖/重写(override),隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...

  8. C#中隐藏(new)、方法重写(override)、重载(overload)的区别

    转自:http://www.cnblogs.com/glife/archive/2009/12/28/1633947.html 重载.重写和隐藏的定义: 重载:public string ToStri ...

  9. c++中的重载(Overload)、覆盖(重写,Override) 、隐藏与using声明

    这些概念有时记住了,但可能没多久就忘了,还是记下来吧.网上找的一篇不错:这里  1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中,不包括继承来的): (2)函数名字相同: (3) ...

随机推荐

  1. xshell安装错解决方案

    之前安装过XShell后来因为各种原因不能使用了,卸载和再次安装的时候安装一直失败.研究了好久终于找到解决方案. 只需要删除在C:\Program Files (x86)\InstallShield ...

  2. STL_map

    map<string,int> m; int main() { m[; cout<<m["]<<endl; ; }

  3. 【Luogu】【关卡2-9】带有技巧的搜索(2017年10月)

    任务说明:这里的搜索不仅包含了dfs和bfs,还包括剪枝.记录等技巧以加快速度. [USACO06FEB]数字三角形Backward Digit Su… 滑雪 吃奶酪 靶形数独 P1118 [USAC ...

  4. rest framework之限流组件

    一.自定义限流 限流组件又叫做频率组件,用于控制客户端可以对API进行的请求频率,比如说1分钟访问3次,如果在1分钟内超过3次就对客户端进行限制. 1.自定义限流 假设现在对一个API访问,在30s内 ...

  5. rest framework之视图组件

    一.APIView  APIView继承的是和django中CBV模式下的View类.View类中的dispatch方法通过反射对不同的请求方法执行不同的函数.而APIView不仅拥有这个特性,而且重 ...

  6. Linux 临时和永久关闭 Selinux

    查看当前 Selinux 状态:getenforce 临时关闭 Selinux:setenforce 0 永久关闭 Selinux: vim /etc/sysconfig/selinux 将 SELI ...

  7. PHP FILTER_VALIDATE_REGEXP 过滤器

    定义和用法 FILTER_VALIDATE_REGEXP 过滤器根据兼容 Perl 的正则表达式来验证值. Name: "validate_regexp" ID-number: 2 ...

  8. Android中如何搭建一个WebServer

    今天终于把老大交代的任务搞完了,感觉收获挺多的,所以就写一篇来记录一下吧,首先还是来看一下,老大们的需求 需求: 希望移动端的用户标识(IMEI)和HTML页面的用户标识(Cookie)连接起来,其中 ...

  9. python 模块-json

    1.JSON(Javascript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Lan ...

  10. Spring Boot项目生成jar包,并在windows服务器中注册成服务,开机启动

    背景: 使用Spring Boot开发的Web项目,打包生成了一个jar包,希望能部署在Windows服务器中 尝试: 1.Spring Boot生成的jar包,可以直接用java -jar运行,但是 ...