这个标题写出来好长时间了,都没写内容,今天无论如何都得写完它,昨天写了一段,尼玛,电脑突然死机,重启之后啥都没了。

继承嘛,有人觉得很简单,但是里面还是有内容可以讲的,因为面向对象也就这么点内容,封装、继承、多态,这三样是有紧密关系的,初学者以后会有深刻体会的。

言归正传,继承如何定义:[访问修饰符] class 子类标识符:父类标识符

继承有何作用,这里面有大文章,有继承才有多态,有继承才有面向接口编程,有继承才是真正的面向对象,就像人类一样不断的繁衍后代,后代有祖先的特征,继承说的就是这件事。继承可以大大简化代码,实现代码重用,这是最基本的作用。为什么讲继承才有多态?

这里面牵扯到一个问题,就是父类引用子类对象的时候,父类调用的子类的属性或方法,还是调用父类的属性和方法,我们来看个例子,star是指明星,父类;歌手singer是明星的子类,演员actor是明星的子类   

   public class Star
{
public void print()
{
Console.WriteLine("我是明星");
}
}
public class Singer : Star
{
public new void print()
{
Console.WriteLine("我是歌手");
}
}
public class Actor : Star
{
public new void print()
{
Console.WriteLine("我是演员");
}
}

调用,我们的预期是输出:我是明星,我是歌手,我是演员

Polymorphism.Star star = new Polymorphism.Star();
star.print();
star = new Polymorphism.Singer();
    star.print();
star = new Polymorphism.Actor();
    star.print();

但是让我们看实际的结果

由此可以看出,父类对象引用子类对象时,调用父类子类的同名方法时,实际上调用的是父类里的同名方法,为什么?这里有两个概念,一个是方法隐藏,一个是向上转型

方法隐藏看下图:

子类如果定义了与父类同名的方法,子类的方法会隐藏父类的方法,不会产生冲突,隐藏父类方法只是说明不会冲突,但是父类对象引用子类对象调用的依然是父类里的同名方法,这是向上转型。编译时,父类对象只能识别自己内部的成员,在运行时,父类对象才知道引用了哪个内存空间,即引用了哪个对象,此时父类对象只能调用父类的成员。

这段解释的比较好:

其实多态也挺好理解的,你也提到父类引用指向子类对象,f只是一个引用,它指向的才是我们实际访问的对象,f只是我们访问对象的一个入口,这个入口是父类类型,只提供了父类暴露出来的方法,所以我们在通过f访问时只能执行父类暴露出来的方法,但我们实际访问的是子类对象,至于子类是怎样实现这方法的和父类完全没有关系,子类完全可以调用自己的任何方法和属性。像一个类实现一个接口一样,接口方法都没有实现,我们同样可以用接口的引用指向其实现类的对象。

C#深入浅出 继承(六)的更多相关文章

  1. javascript继承(六)—实现多继承

    在上一篇javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) ,介绍了js较完美继承的两种实现方案,那么下面来探讨一下js里是否有多继承,如何实现多继承.在这里可以看看j ...

  2. C++ 类的继承六(多继承的二义性--虚基类)

    //多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 * ...

  3. Python中深浅拷贝 垃圾回收与 super继承(六)

    1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy ...

  4. Nacos深入浅出(六)

    其实我们发现在我们本地新生成了文件,这个文件就是nacos; 这个文件怎么那么眼熟,不就是我们的controller中的注解里面的参数value么: @Controller @NacosPropert ...

  5. Tomcat深入浅出——最终章(六)

    前言 利用了六天的时间,对Tomcat的内容进行了整理. 学习不易.整理也不易,自己坚持的更了下来,很不错. 希望每一位在努力前行的小伙伴,都要相信坚持就会有收获. 本次Tomcat就探寻到这里,明年 ...

  6. JavaScript 对象 之继承对象 学习笔记

    假设,我们有个这样的需求: 两个种族,每个种族都有 名字.血量(默认200).行为(行为有 跳跃.移动速度 这些属性)等共有属性. 人族能量值比兽人多10%,兽人血量比人族多10%. 职业有战士和法师 ...

  7. JavaScript继承学习笔记

    JavaScript作为一个面向对象语言(JS是基于对象的),可以实现继承是必不可少的,但是由于本身并没有类的概念,所以不会像真正的面向对象编程语言通过类实现继承,但可以通过其他方法实现继承.(jav ...

  8. Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关

    本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...

  9. js 继承的简单理解

    什么是继承 js中的继承就是获取存在对象已有属性和方法的一种方式. 继承一 属性拷贝 就是将对象的成员复制一份给需要继承的对象. // 创建父对象 var superObj = { name:'liy ...

随机推荐

  1. 移动端报表JS开发示例--获取定位

    上次分享了移动端报表JS开发的系统概念,后来我又回去摸索了一些案例.之前接触到的FineReport的APP客户端可以用来打卡签到,就好奇研究了以下,这次就来聊一聊报表移动端开发如何实现定位功能. 1 ...

  2. VMware下CentOS6.8配置GFS文件系统

    1.GFS介绍 GFS简要说明,它有两种: 1. Google文件系统:GFS是GOOGLE实现的是一个可扩展的分布式文件系统,用于大型的.分布式的.对大量数据进行访问的应用.它运行于廉价的普通硬件上 ...

  3. video标签播放视频

    <!doctype html> <html> <head> <meta charset=utf-8> <title>测试</title ...

  4. POJ 2914 Minimum Cut

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 9319   Accepted: 3910 Case ...

  5. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 主管可以看下属的数据

    主管可以看下属的数据,这个是经常用到的一个权限,不管是大公司,还是小公司都需要的功能. 通过以下2个方法,可以任意达到想要的效果了,设置简单灵活,还能递归运算下属,有时候简单好用就是硬道理. #reg ...

  6. 【Python】[模块]使用模块,安装第三方模块

    一个.py文件就称之为一个模块(Model)按目录来组织模块的方法,称为包(Package)每一个包目录下面都会有一个__init__.py的文件内置函数1.使用模块 导入模块 import sys ...

  7. 使用对话框 —— Dialog

      对话框就是一般的弹出窗口,主要用来提示用户,和用户交互.   创建Activity对话框 使用Activity模拟对话框.这个比较简单,主要是使用Activity自带的Dialog主题.   创建 ...

  8. 谈一谈IOC、DI

    Inversion of control(控制反转) 原来由类库主动去创建对象的方式变为容器装配的方式,装配的方式:设置配置文件. 对象由IOC容器管理,包括创建.释放.存在形式.生命周期的管理等. ...

  9. Vue.js之v-if

    ---恢复内容开始--- 首先,在跟着api做的时候,要把v-if包裹在Vue对应的el里面,重要的事情说三遍. html: <div id="vif"> <di ...

  10. 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)

    Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...