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

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

言归正传,继承如何定义:[访问修饰符] 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. Hibernate核心技术简介

    Hibernate核心技术简介 1.Hibernate映射文件开发     Hibernate映射文件就是项目中*.hbm.xml文件,其主要是完成各元素的配置,包括根元素.类元素.定义主键.设置主键 ...

  2. DNS查找域名的过程

    当我们在浏览器输入一个url地址时,需要获取到这个url的域名,本篇文章主要介绍了关于DNS查找解析域名的过程的一些东西. 关于DNS 不清楚DNS的小伙伴可以点这里:关于域名系统DNS解析IP地址的 ...

  3. matlab里的svmtrain的输出model里,各参数的含义

    Parameters: [5x1 double]  %结构体变量,依次保存的是 -s -t -d -g -r等参数      nr_class: 4    %分类的个数          totalS ...

  4. OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  5. LL(1)算法

    编译原理的语法分析中一个入门的算法就是LL(1)算法了,这里做一个总结.首先比较重要的是FIRST集和FOLLOW集合的生成. 先上个例子吧: 首先说一下FIRST集的生成,这个就要看产生式右部对应的 ...

  6. NPM 无法下载任何包的原因,解决方法

    前几天发现NPM 无法现在任何的包 通过npm i testPackage -ddd 发现 是卡在了 npm verb addRemoteTarball 这行,google后发现 是有多个tmp地址, ...

  7. 17-前端开发之jQuery

    什么是 jQuery ? jQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程. jQuery是一个兼容多浏览器的javascript库,核心理念是write l ...

  8. jQuery美化下拉菜单插件dropkick

    dropkick是一款基于jquery库的美化下拉框下拉菜单的插件,它通过定制HTML插入可使丑陋无聊的<select>下拉列表变得美丽. name属性是唯一一个必需的填写的,不过你也应该 ...

  9. JS组件系列——表格组件神器:bootstrap table

    前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉及,罪过,罪过.今天补起来吧.上午博主由零开始自己从头到尾使用了一遍Bootstrap Table ,遇到不少 ...

  10. 基于SoCkit的opencl实验1-基础例程

    基于SoCkit的opencl实验1-基础例程 准备软硬件 Arrow SoCkit Board 4GB or larger microSD Card Quartus II v14.1 SoCEDS ...