继承是在类之间建立一种相交的关系,使得新定义的派生类的实例可以继承已有的基类的特征并且还可以添加新的功能。

文章目录

  • 一、C#继承的相关概念
  • 二、C#继承的特点讲解
  • 三、C#继承的程序流程
  • 四、简单的继承案例(含构造函数、方法继承)
  • 五、抽象类、密封类、抽象方法和虚方法

一、C#继承的相关概念

  1. 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用已存在的类的功能。
  2. 为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块。
  3. 继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。
  4. 现实世界中的许多实体之间不是相互孤立的,它们往往具有共同的特征也存在内在的差别。人们可以采用层次结构来描述这些实体之间的相似之处和不同之处。
  5. 在C#中,如果一个类后面通过冒号又跟了另外一个类,那么我们就称冒号前面的类为子类,冒号后面的类为父类。这种书写类的方式放映出来的关系就称为类的继承关系。
  6. 子类:派生类;父类:基类或者超类。

二、C#继承的特点讲解

  1. 派生类是对基类的扩展,派生类可以添加新的成员,但不能移除已经继承的成员的定义。
  2. 继承是可以传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中声明的成员。
  3. 构造函数和析构函数不能被继承,除此之外其他成员能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
  4. 派生类如果定义了与继承而来的成员同名的新成员,那么就可以覆盖已继承的成员,但这兵不是删除了这些成员,只是不能再访问这些成员。
  5. 类可以定义虚方法、虚属性及虚索引指示器,它的派生类能够重载这些成员,从而使类可以展示出多态性。
  6. 派生类只能从一个类中继承,可以通过接口来实现多重继承。

三、C#继承的程序流程

1、如果new一个子类对象,那么有如下执行流程:

  1. 先定位到子类对应构造函数,没有继承的话,执行子类的方法体。
  2. 如果有继承,则转向了父类的构造函数,执行父类构造方法体。
  3. 之后,转向了子类的方法体继续执行。

2、如果在子类构造中,没有使用base或者:base()显示调用父类的构造,那么系统也会自动调用父类的无参构造。

  1. base代表父类对象,通过:base()调用父类的构造函数,在这里:我们就可以理解为继承,而base()就是父类的构造函数,()里的的参数就是构造函数的参数。
  2. base代表的是方法调用,可不需要参数,此时调用父类的无参构造函数。
  3. 如果要调用父类的有参构造函数,base里需传入对应的参数。

3、通过base调用父类构造函数需要注意以下两点:

  1. 通过base调用父类构造函数,只能书写在子类的构造后。
  2. 通过base调用父类构造函数参数顺序和父类的构造参数一致。

关于base继承构造函数的知识,请查看本人另一篇博文:C#中base关键字的几种用法

四、简单的继承案例(含构造函数、方法继承)

1、创建类

public class Person
{public Person(){Console.WriteLine("Person无参的构造函数");}public Person(string name,string sex,int age){Console.WriteLine("Person有参的构造函数,我的名字叫{0},性别为{1},年龄为{2}",name,sex,age);}public void Run(){Console.WriteLine("我可以跑~");}public void Play(){Console.WriteLine("我会玩耍~");}
}
public class Teacher:Person
{public Teacher(){Console.WriteLine("Teacher无参的构造函数");}public Teacher(string name,string sex,int age):base(name, sex, age){Console.WriteLine("Teacher有参的构造函数,我的名字叫{0},性别为{1},年龄为{2}",name,sex,age);}public void Teach(){Console.WriteLine("我会教书~");}
}

注意:Teacher的构造函数的参数与base里的参数要相互对应,其就相当于实参,而原父类的构造函数里的参数就是形参。在子类实例化时,通过其进行传参。

2、在主方法中进行实例化,并调用其方法

Teacher th = new Teacher("张三","男",23);
th.Run();
th.Play();
th.Teach();

3、执行效果

五、抽象类、密封类、抽象方法和虚方法

首先还有一种类需要注意,那就是密封类。如果我们对类不作任何约束,也就是说所有类都可以被继承,这种继承的滥用会导致类的层次结构十分庞大,类与类之间的关系会变得很乱导致无法理解。因此C#提供了密封类,我们只需在父类前加上sealed修饰符,那这个类将不能被继承了。密封方法也是在方法前加上sealed修饰符。

抽象类和密封类刚好相反,它是为继承而生的。抽象类不能实例化,抽象方法没有具体执行代码,必须在非抽象的派生类中重写。也就是基类并不实现任何执行代码,只是进行定义。这一点和接口有相同的地方。

class Program
{static void Main(string[] args){Man man = new Man();man.Eat();man.Say();}
}
public abstract class People
{//注意:如果类中有抽象方法,则类必须声明为抽象类。public People(){Console.WriteLine("父类的构造函数");}public abstract void Eat();//有时候不想把类声明为抽象类,但又想实现方法在基类里不具体实现,//而是想实现方法由派生类重写。遇到这种情况时可使用virtual关键字将方法声明为虚方法public virtual void Say(){//注意虚方法必须声明方法主体,抽象方法则不需要Console.WriteLine("我是父类的虚方法");}
}
class Man:People
{   public Man(){Console.WriteLine("子类构造函数");}public override void Eat(){Console.WriteLine("我是子类");}public override void Say(){Console.WriteLine("我是子类的Say方法");}
}

深入理解C#面向对象之继承相关推荐

  1. 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?

    面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率. 该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有 ...

  2. python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法

    python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大.对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的. 下面开始讲讲关 ...

  3. 子类重载父类函数_Python面向对象之继承、重写与重载

    回顾 在Python进阶记录之基础篇(十六)中,我们介绍了Python面向对象中对属性的访问限制,需要重点掌握私有变量和公有变量的区别和用法,牢记面向对象的编程规则.今天我们讲一下Python面向对象 ...

  4. python继承语法_python语法学习面向对象之继承

    python语法学习面向对象之继承 只要涉及到面向对象,"类"是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念 ...

  5. python中继承和组合的区别_Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类...

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  6. 通过宠物商店理解java面向对象

    前言:本篇博客,适合刚刚学完java基础语法的但是,对于面向对象,理解不够深刻的读者,本文通过经典的宠物商店,来让读者深刻的理解,面向对象,IS-A,HAS-A法则.本文不仅仅是简单的用java来模拟 ...

  7. JavaSE面向对象:继承、多态、Super、Object类、重写、static、final、静态成员、懒汉式、饿汉式、单例设计模式、初始化块、抽象类、抽象方法、接口

    感谢尚硅谷免费提供的视频 继承 ** 理解 ** 生活中的继承:子女继承了父母的财产或相貌或才华 java中的继承:一个类不用自己定义属性或方法,就已经具备了另一个类的属性和方法 把这种现象称为jav ...

  8. 我在千峰培训的日子第十二–十三天------面向对象【继承】

    我在千峰培训的日子第十二–十三天------面向对象[继承] 今日感悟 人生最遗憾的莫过于放弃了不该放弃的,固执的坚持了不该坚持的. 老师知识点 一.局部变量跟成员变量 形参和实参 形参:定义在方法中 ...

  9. python中继承是什么意思_如何理解Python中的继承?python入门

    如何理解Python中的继承?如今,python编程语言深受企业和个人的喜爱.python开发工程师是近年来互联网行业非常热门的职业岗位之一.学习python的人除了零基础的,还有一部分是在职运维.在 ...

  10. 一步步学习SPD2010--第十章节--SP网站品牌化(9)--理解SP的CSS继承

    一步步学习SPD2010--第十章节--SP网站品牌化(9)--理解SP的CSS继承 和你在本书中处理的许多其他文件一样,corev4.css和其他样式表处在每个Web服务器的根目录中.如果你使用SP ...

最新文章

  1. finalshell Linux 传输文件 xftp
  2. 剑指offer(Java实现) 顺时针打印矩阵
  3. 线性表的顺序存储结构(数据结构篇)
  4. SpringMVC的数据响应-页面跳转-返回ModelAndView形式1(应用)
  5. python图形界面库哪个好_8个必备的Python GUI库
  6. [新闻]MacBook Pro新版上市
  7. Fluent API — 流畅API(基于Java介绍)
  8. 二十一天学通C++之使用throw抛出异常
  9. [渝粤教育] 西安交通大学 光通信器件及系统 参考 资料
  10. mysql查询一个月未登录_mysql函数实例-统计1周内未登陆的用户
  11. 视频教程-思科设备管理(CCNA魔鬼训练营系列)-思科认证
  12. 饱暖思淫欲之美女图片的Python爬虫实例(一)
  13. MySQL社区版下载地址
  14. python绘制基因结构图_使用biopython可视化染色体和基因元件
  15. cnzz.php,CNZZ站长统计代码报错解决方法
  16. STM32L4超低功耗特性概述
  17. 兄弟连学python(06)装饰器:对类或者函数进行功能的扩展
  18. LaTex论文排版 | (30) 三线表
  19. 【原神】各角色Pixiv涩图统计(一). 最多的是谁? R18涩图谁最多?
  20. Redis事务与Pipeline功能

热门文章

  1. matlab制作有值显示的条形统计图
  2. 手机的内核版本、基带版本等都是什么意思?
  3. 高并发数据缓存池(基于EHcache)
  4. springboot发送短信验证码
  5. 图像增强(1-灰度级变换)—内涵MATLAB源码
  6. E575: viminfo: Illegal starting char in line:
  7. 学习记录贴4:CMAQ两个脚本同时运行时冲突
  8. github提交隐藏私密信息
  9. fastboot 操作
  10. 有关matlab裁剪图片方面