.NET Core CSharp初级篇 1-6

本节内容为类的多态与继承

简介

终于讲到了面向对象三大特性中的两大特性——继承与多态。通过继承与多态,我们能很好的将类的拓展性发挥到了极致。在下面的内容讲解中,我们将从各个方面对继承和多态进行刨析。

继承

继承事实上是一个非常好理解的语法,在C#中实现继承使用A:B,表示A类继承B类。子类(一称为派生类)继承于父类(一称为基类)就好比孩子继承了父亲的一切,但是孩子总归是有自己的个性的,而父亲也有一些不会告诉孩子的事情。如果我们从之前的访问控制符这一部分进行理解的话,你可以这样描述这个“融洽”的父子关系。

假定有以下这个例子:塞巴斯蒂安·艾奎斯(父类)是一个欧洲宫廷的贵族,67岁,他是一个子爵,并且掌握了一个惊天大秘密不能告诉任何人,只能烂在肚子里。他育有一子名叫麦克·艾奎斯,由于塞巴斯蒂安·艾奎斯年老体弱,当家里需要钱的时候,他会让自己的儿子带上银行卡前往atm机取钱。儿子的车和他的车一模一样,每次儿子让管家开车的时候都必须说清楚:“我要开我父亲的车。”,或者:“今天我开我自己的车”。如果他没有说,那么管家会默认的取出儿子的车。他家还有一个大庄园闲置可以用于开发,只要父亲同意,那么儿子可以自由开发。

对于这个例子,你需要得出的结论是:

  • 如果塞巴斯蒂安·艾奎斯(父类)没有出生,那么麦克·艾奎斯(子类)也不存在。(子类实例化时必定先调用父类构造方法)
  • 对于塞巴斯蒂安·艾奎斯(父类),他的名字属于大家都可以知道的(public),谁都可以轻易的得到。但是想拥有这个名字,却只能是他的家族的人才可以(继承后才能获得父类的字段)。
  • 对于前往ATM机取钱这件事,取款密码只可能告诉他的儿子,别人是不能得到的。(protected可以被子类访问,但是其余不可访问)
  • 塞巴斯蒂安·艾奎斯(父类)知道一个秘密,这个秘密只有他本人才知道(private),包括他的儿子也不可能知晓(子类无法获取private)
  • 因为父子俩的车一模一样,取车需要特别说明(子类和父类函数签名一致时,父类函数默认会隐藏,除非显式的说明)
  • 大庄园是父亲的,但是可以被儿子取改造(父类函数指定为virtual时,子类可以重写父类函数)

通过这一些刨析,我认为你应该已经清楚了七八分继承的意思了。这里需要介绍一下我们的base关键字,base关键字在子类中体现为调用父类的方法。

特别的,你需要注意的是,C#对于类与类的继承只支持单继承,如果你试图实现多继承,你可以使用接口作为媒介和桥梁。

我们现在用一段代码演示完我们的继承,我们这个教程更多的是引导你去思考,而不是让你如同一些速成培训班出来的一样,没有独立的思考能力。

class Father
{
public Father()
{
Console.WriteLine("Father Method");
}
private string MSGSecret;
protected string BankSecret;
public string Name;
public string Car;
protected void test()
{ }
}
class Son:Father
{
public Son()
{
Console.WriteLine("Son Method");
}
//隐式的生成了这三个字段
//protected string BankSecret;
//public string Name;
//public string Car;
public string Car;
public void getCar()
{
base.Car;//父类
this.Car;//子类
base.test()//调用父类方法,如果签名不冲突,可以省略base
}
}
Son s = new Son();//思考一下这里会输出什么?

多态

多态是一个并不困难的东西,在继承和接口中我们讲到的重写其实就是多态性的一种类型了。之前我们简单的举过一个例子来说明多态:人和鲤鱼都是动物,但是人用肺进行呼吸,而鲤鱼用鳃进行呼吸。这个例子就很好的体现了多态。利用下面这段代码来解释吧。

class Animal
{
//通过抽象方法实现多态
abstract void Breathing();
//虚方法实现多态
virtual void Eat()
{
}
}
class Human:Animal
{
override void Breathing()
{ }
override void Eat()
{ }
}
class Fish:Animal
{
override void Breathing()
{ }
new void Eat()
{ }
}
Animal ah = new Human();
Animal af = new Fish();
Fish f = new Fish();

注意看最后几行,ah和af各属于Human和Fish的对象,但是当方法调用的时候,统一调用父类中的方法,并且加载子类中的重写和实现。

ah.Eat();//调用父类的Eat(),但是以Human类中的重写方法为实现
af.Eat();
f.Eat();

这三者的区别在哪里?事实上你只需要知道,多态性就是通过父类去管理子类,让子类遵循父类的规范。当子类使用从父类继承的方法的时候,是去调用父类的方法,但是使用子类的实现。特别的,如果你在方法中使用new修饰符,那么这个方法将会和父类毫无关系,就如这个单词的意思一样,这是一个新的函数,不是父类中的函数。现在你可以试着分析上述三个函数调用的各是哪个类中的方法。

多态最大的有点就是你可以通过一个基类或者接口去管理所有继承于他们的子类的函数方法,并且同一个函数可以有多种实现方法。

如果你使用接口和抽象类去实现多态,实现的方法也是一样的,只不过是基类型无法实例化。

Github

BiliBili主页

WarrenRyan's Blog

博客园

.NET Core CSharp初级篇 1-6 类的多态与继承的更多相关文章

  1. .NET Core CSharp初级篇 类的生命历程

    .NET Core CSharp初级篇 1-7 本节内容为类的生命周期 引言 对象究竟是一个什么东西?对于许多初学者而言,对象都是一个非常抽象的知识点.如果非要用一句话描述,我觉得"万物皆对 ...

  2. .NET Core CSharp初级篇 1-1

    .NET Core CSharp初级篇 1-1 本节内容是对于C#基础类型的存储方式以及C#基础类型的理论介绍 基础数据类型介绍 例如以下这句话:"张三是一名程序员,今年15岁重50.3kg ...

  3. NET Core CSharp初级篇 1-3面向对象

    .NET Core CSharp初级篇 1-3 本节内容为面向对象初级教程 类 简介 面向对象是整个C#中最核心最有特色的一个模块了,它很好的诠释了程序与现实世界的联系. 面向对象的三大特征:继承.多 ...

  4. .NET Core CSharp初级篇 1-5 接口、枚举、抽象

    .NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...

  5. .NET Core CSharp初级篇 1-8泛型、逆变与协变

    .NET Core CSharp初级篇 1-8 本节内容为泛型 为什么需要泛型 泛型是一个非常有趣的东西,他的出现对于减少代码复用率有了很大的帮助.比如说遇到两个模块的功能非常相似,只是一个是处理in ...

  6. .NET Core CSharp初级篇 1-2 循环与判断

    .NET Core CSharp初级篇 1-2 本节内容循环与判断 循环 循环是一个在任何语言都是极为重要的语法,它可以用于很多东西,例如迭代数组等等.在C#中,语法层面的循环有:for , fore ...

  7. CSharp初级篇 1-4 this、索引器、静态、常量以及只读

    .NET Core CSharp初级篇 1-4 本节内容为this.索引器.静态.常量以及只读 简介 在之前的课程中,我们谈论过了静态函数和字段的一小部分知识,本节内容中,我们将详细的讲解关于对象操作 ...

  8. .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary

    .NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...

  9. .NET Core CSharp 中级篇 2-1 装箱与拆箱

    .NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...

随机推荐

  1. 动态链接库(Dynamic Link Library)学习笔记(附PE文件分析)

    转载:http://www.cnblogs.com/yxin1322/archive/2008/03/08/donamiclinklibrary.html 作者:EricYou 转载请注明出处   注 ...

  2. 网站压力测试工具 Webbench简单介绍

    Webbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况.Webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量.Webbench不但 ...

  3. Hexo+NexT(五):Hexo第三方插件提供功能及配置

    本篇文章介绍NexT中通过第三方实现的功能,有的需要通过额外的插件,有的需要通过第三方提供的功能.这些功能丰富了网站内容,弥补了原生静态网站的不足. Hexo博客专题索引页 增加百度统计分析功能 访问 ...

  4. centos 5.5版本中添加ext4格式

    1.我在使用centos 5.5版本做练习的时候发现默认是不支持ext4文件格式. 在添加硬盘后,用fdisk -l 查看到信息如下: 分区完后,使用命令:mkfs -t ext4 /dev/sdb会 ...

  5. Solr 18 - 通过SolrJ局部更新Solr中的文档 (原子操作、非覆盖操作)

    目录 1 需求分析 2 需求实现 2.1 pom.xml依赖 2.2 Java代码示例 3 补充说明 3.1 关于文档中_version_的取值说明 3.2 store=true/false的区别 1 ...

  6. Mysql索引优化之索引的分类

    Mysql的历史 简单回顾一下Mysql的历史,Mysql 是一个关系型数据库管理系统,由瑞典 Mysql AB 公司开发,目前属于 Oracle 公司.关系型数据库​将数据保存在不同的表中,而不是将 ...

  7. HDU 1561:The more, The Better(有依赖的树型背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意:有n个点,容量为m,每个点有一个价值,还给出n条边,代表选第i个点之前必须先选ai,问最多的价值能取 ...

  8. 花5分钟时间来了解一下高性能网关Kong会有意外收获

    前言 前几天开源发布了 Kong.Net 项目,收到了大量园友的反馈,开源当天就突破了 100 个star ,可喜可贺,但是从侧面也说明,我们 .NetCore 阵营真的非常需要拥抱开源,应该敞开心扉 ...

  9. django基础知识之ORM简介:

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  10. 字符串和字符编码unicode

    python基础第三天 字符串 str 作用: 用来记录文本(文字)信息,给人类识别用的,为人们提供注释解释说明 表示方式: 在非注释中,凡是用引号括起来的部分都是字符串 ' 单引号 " 双 ...