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

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

言归正传,继承如何定义:[访问修饰符] 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. centos yum update kernel

    1.查看当前kernel版本 uname -r 2.查看已安装版本 rpm -q kernel 3.查看可升级kernel版本 yum list kernel 4.升级kernel版本 yum upd ...

  2. Citrix Xen Desktop安装配置

    Citrix虚拟化的东西其实和我现在做的东西完全没有关系的.反正接到通知要搭一个Citrix Xen Desktop那就做. 先放几个教程: :跟着图片通过XenDesktop7发布Win8桌面 这个 ...

  3. 测试环境搭建心得 vs2008+SQL2008 PHP+APACHE+mysql Team Foundation Server2013

    大四即将结束,大学的最后一个假期,找到一份实习工作,担任测试工程师.在过年前的最后一周入职,干了一周的活儿.主要工作就是搭建测试环境. VMware 主要熟悉VMware软件,装系统基本都没什么问题. ...

  4. 基于Simple Image Statistics(简单图像统计,SIS)的图像二值化算法。

    这是个简单的算法,是全局二值算法的一种,算法执行速度快. 算法过程简单描述如下: 对于每一个像素,做如下处理 1.计算当前像素水平和垂直方向的梯度. (two gradients are calcul ...

  5. Python的列表推导式,字典推导式,集合推导式使用方法

    推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...

  6. Linux编译安装源码包的流程

    流程: 1.  下载并解压源码包2.  运行:configure3.  编译:make4.  安装:make install 编译时需要注意一个原则:不要在解压的包中直接执行./configure.m ...

  7. SQL/LINQ/Lamda 写法[转发]

    SQL LINQ Lambda SELECT * FROM HumanResources.Employee from e in Employees select e Employees   .Sele ...

  8. webconfig中配置各种数据库的连接字符串(转)

    一.在appSettings配置 <appSettings>   <!--SQL Server--> <!--<add key="SQLString&qu ...

  9. Struts2 Interceptor学习

    Interceptor的设计思想,其实是Spring里面的AOP思想,尽管Struts2又有自己的Interceptor但是,在实际开发中,用的较少,SSH整合之后你可以采用AOP事务处理进行拦截,更 ...

  10. ReactNative新手学习之路04 组件化开发轮播图swiper支持安卓和IOS

    react native 新手之路04 组件化开发轮播图swiper支持安卓和IOS npm install react-native-carousel --save git 地址Properties ...