.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. 去除文件属性(使用SetFileAttributes API函数)

    FILE_ATTRIBUTE_ARCHIVE 文件存档(备份或移动时会对文件做标记).FILE_ATTRIBUTE_ENCRYPTED 加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加 ...

  2. 通过OSG实现对模型的日照模拟

    目录 1. 加载模型 2. 光照 1) 环境反射 2) 漫反射 3) 日照方向 (1) 太阳高度角和太阳方位角 (2) 计算过程 4) 改进实现 3. 阴影 4. 太阳高度角与太阳方位角的计算 1) ...

  3. abp(net core)+easyui+efcore仓储系统——领域层创建实体(三)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  4. RSA der加密 p12解密以及配合AES使用详解

    在前面的文章中我有说过AES和RSA这两种加密方式,正好在前段时间再项目中有使用到,在这里再把这两种加密方式综合在一起写一下,具体到他们的使用,以及RSA各种加密文件的生成. 一: RSA各种加密相关 ...

  5. .NET架构师知识普及

    今天看到一篇漫画,[3年.NET开发应聘大厂惨遭淘汰,如何翻身打脸面试官?],好多问题,一下子还真的回答不了,这里对这些问题进行了整理,增加下脑容量,哈哈.俗话说不想当将军的士兵不是好士兵,不想当架构 ...

  6. 【转载】BIO、NIO、AIO

    请看原文,排版更佳>转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深 ...

  7. PowerDesigner16.5 有用地址

    http://blog.csdn.net/keenweiwei/article/details/32720427

  8. Oracle 数据库表中已有重复数据添加唯一键(唯一约束)

    Oracle 数据库表中已有重复数据添加唯一键(唯一约束) 问题描述 以 demo 举例,模拟真实场景. 表 TEST_TABLE 有如下字段和数据:id 是主键,code 没有设置键和索引 ID C ...

  9. C# 死锁 Task/AutoResetEvent

    与之前<C# 死锁 TaskCompletionSource>类似,还有很多死锁的案例 使用Task异步转同步时,使用不当造成的死锁 private void Task_OnClick(o ...

  10. C# Invoke

    最近在看一个项目,其中用到异步进程——控件Invoke,这里将具体用法介绍如下: 以进度条为例: //声明委托 delegate void SetProgressBarEnabledDelegate( ...