C#基础知识-面向对象思想之继承(八)
上一篇的标题编程思想我觉得不是很符合主题,因为编程思想的范围太大了,不仅仅是封装 继承 多态,所以比较符合主题的应该是面向对象思想。这一篇中将继续叙述面向对象思想中的继承。
从字面来看继承表达的意思已经很清楚了,我们看电视剧就经常有一个富二代老头去世或者退位,就由儿女继承他的家产,一个黑帮老大倒下,由他最得力的小弟继位,这些都是继承,现实世界中的继承是过继,是将老爸(父类)的财产或权利过继给儿女,过继完后老爸(父类)将不再拥有这些东西,而程序中的继承并不是将父类的东西过继给子类,更多的像是一中基因的遗传,老爸(父类)有的属性和行为,你都可以完全的拥有,并且老爸(父类)中的这些行为和属性仍然还在,并不会因为继承而消失,如下图:

在程序中的继承和现实世界中的继承是不一样的,子类继承于父类后,父类仍然拥有这些属性和行为。
继承的基本概念:
C#中只支持单继承,但运行实现多个接口,支持多接口继承(接口将会在下一章说明)。
当子类继承与父类则自动拥有父类中所有的成员(私有除外)。
密封类、结构类不可继承。
下面来看一段简单的代码:
首先创建一个动物父类
public class Animal
{
//名称
private string Name; //呼吸方法
public void breathing()
{
Console.WriteLine(Name + "在呼吸...");
} //进食
public void eating()
{
Console.WriteLine(Name + "在进食...");
} //使用构造函数初始化名称
public Animal(string Name)
{
this.Name = Name;
}
} 再创建一个人类(子类),继承使用 类名 :父类名 的格式
//人类是动物的一种
public class Person : Animal
{
//使用构造函数初始化父类动物的名称
public Person(string Name) : base(Name)
{ }
} 通过子类调用父类的方法:
class Program
{
static void Main(string[] args)
{
//实例化一个Person类,并且在构造函数中传入一个参数
Person person = new Person("人类");
//调用父类呼吸方法
person.breathing();
//调用子类进食方法
person.eating();
Console.ReadKey();
}
}
通过这里可以看到子类并没有创建 breathing 和 eating方法,但是可以在实例中直接的调用,这就是自动的拥有的父类的行为。
到这里再思考一下,如果父类中的方法我们并不满意想要用自己的方法去代替父类,那么在父类中的方法就要声明虚方法(virtual),可以在子类中重写(override)父类的函数
虚方法(virtual)的使用:
比如在Animal类中想要派生一个子蛇类Snake,蛇在冬天的时候会冬眠一段时间所以不需要进食,那么只需要在Animal类中添加一个virtual关键字,代表是虚方法,可以直接拿来用也可以根据子类的需要重写它:
public class Animal
{
//名称
private string Name; //呼吸方法
public void breathing()
{
Console.WriteLine(Name + "在呼吸...");
} //进食添加一个虚函数子类可以重写它
public virtual void eating()
{
Console.WriteLine(Name + "在进食...");
} //使用构造函数初始化名称
public Animal(string Name)
{
this.Name = Name;
}
}
//子类中使用重写(override)
public class Snake : Animal
{
public Snake(string name) : base(name)
{ }
//重写父类方法
public override void eating()
{
Console.WriteLine("现在是冬天不需要进食!");
}
} 当然我们也可以直接覆盖掉父类的方法,这里注意重写和覆盖的作用是不同的。
public class Snake : Animal
{
public Snake(string name) : base(name)
{ } //直接在函数前面使用new覆盖父类方法
new public void eating()
{
Console.WriteLine("现在是冬天不需要进食!");
}
}
小结一下,这篇文章中我们介绍了继承的基本概念,还有使用了简单的代码来演示继承在程序中的表达方式,其实要深入的话还有很多的作用,但是篇幅有限,这里我指介绍最基本的用法,如果有遇到问题的朋友也可以直接发微信给我。
C#基础知识-面向对象思想之继承(八)的更多相关文章
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- Python类基础知识(面向对象基础)
#首先 我们需要了解 面向过程是什么 面向对象是什么 我们为什么需要使用面向对象 面向过程:根据业务逻辑从上到下写垒代码 面向对象:根据代码对函数进行分类和封装 区别:解决问题的逻辑不同,但是都能解决 ...
- Java基础知识➣面向对象(八)
概述 Java和C#都是面向对象语言,面向对象编程是目前高级语言习惯的编程模式,与C++编写过程编程而言,面向对象使用起来高效.灵活:面向对象的三个特征:封装.继承和多态. Java面向对象 1.类封 ...
- Python基础之面向对象3(继承)
一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...
- C#基础知识-编程思想之封装(七)
既然是学习面向对象的编程那自然要了解面向对象中的三大基石,封装.继承和多态. 我觉得要解释这三大基本概念用一篇文档很难解释清楚,想要具体形象的去了解,还是需要每一个概念用一个篇幅来说明,将封装.继承和 ...
- Lua 基础知识-面向对象
通过函数闭包的方式来实现面向对象 -- 通过函数闭包的方式来实现面向对象 function People(name) local self = {} local function init() sel ...
- Java核心技术卷一基础知识-第5章-继承-读书笔记
第5章 继承 本章内容: * 类.超类和子类 * Object:所有类的超类 * 泛型数组列表 * 对象包装器和自动装箱 * 参数数量可变的方法 * 枚举类 * 反射 * 继承设计的技巧 利用继承,人 ...
- java基础知识(5)---继承
继 承:(面向对象特征之一)好处:1:提高了代码的复用性.2:让类与类之间产生了关系,提供了另一个特征多态的前提. 父类的由来:其实是由多个类不断向上抽取共性内容而来的.java中对于继承,java只 ...
- python基础知识09-继承,多继承和魔术方法
1.继承 class Father: def init(self,age,sex): self.age = age self.sex = sex class Son(Father): 类名后面写括号, ...
随机推荐
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- IE报vuex requires a Promise polyfill in this browser问题解决
使用Vuex, IE浏览器报错 因为使用了 ES6 中用来传递异步消息的的Promise,而IE低版本的浏览器不支持. ##解决方法 第一步: 安装 babel-polyfill . babel-po ...
- dva框架使用mock.js模拟数据 + fetch请求数据
what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...
- javascript 函数和作用域(函数,this)(六)
重点. 一.函数 1.函数介绍 函数是一块JavaScript代码,被定义一次,但可执行和调用多次.JS中的函数也是对象,所以JS函数可以像其他对象那样操作和传递,所以我们也常叫JS中的函数为函数对象 ...
- Maven的简单搭建
Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.接下来将从下面几个方向介绍maven: (1)Maven简单介绍 (2)Maven安装与配置 (3)Maven ...
- PRML读书笔记——机器学习导论
什么是模式识别(Pattern Recognition)? 按照Bishop的定义,模式识别就是用机器学习的算法从数据中挖掘出有用的pattern. 人们很早就开始学习如何从大量的数据中发现隐藏在背后 ...
- 【Android Widget】1.TextView
1.创建可被点击的TextView 1.1 在xml中创建可被点击的TextView android:autoLink 是否将符合指定格式的文本转换成可单击的超链接. 属性值可以是如下几个属性值的一个 ...
- 用react系列技术栈实现的demo整合系统
引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果‘课后’适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术 ...
- linux防火墙基本操作
1.查看防火墙运行状态 # firewall-cmd --state 或者 # systemctl status firewalld.service .关闭防火墙 # systemctl stop f ...
- C#基础知识-编程思想之封装(七)
既然是学习面向对象的编程那自然要了解面向对象中的三大基石,封装.继承和多态. 我觉得要解释这三大基本概念用一篇文档很难解释清楚,想要具体形象的去了解,还是需要每一个概念用一个篇幅来说明,将封装.继承和 ...