红豆带你从零学C#系列之:初识继承与多态
继承
现实生活当中,人类又可以根据职业分为:教师,学生,理发师,售货员
又比如飞机又有种类之分:直升飞机、客机、货机、战斗机等
在程序里面我们可能会通过创建类来描述这样的事物,比如学生类、教师类、理发师类等等。
每个类都有许多相似的属性,又有自己独特的属性和方法,比如学生类有学员证,有上学的方法、老师有工资、理发师有理发的方法,用一张图来概括就是:
如果要创建10几20个这样相似的类,要编写重复的代码变多,工作量变大,代码冗余使得程序维护起来不是特别方便,有没有什么办法可以解决这样的问题呢?是不是可以把这些类的相同的一些属性都放在一个公共类里面去呢?
Tip(补充案例):游戏怪物类,红毛怪类,长手怪类,史莱姆怪类,哥布林怪类
一、 类的继承
用法:
public class A{ public int num1; public int num2; }
public class A1:A{} A1类继承于A类
public class A2:A{} A2类继承于A类
于是A1和A2类不需要重复写同样的属性代码,通过继承父类(A类),就可以继承父类的属性和方法,如图:
通过类的继承,可以使得我们创建具有许多共同属性的类的时候可以避免重复的代码,造成冗余。通常我们把A类称为“父类”,A1,A2称为“子类”。
base关键字和protected修饰符
我们知道可以用this关键来表示当前的类的实例,通过this可以访问类本身的成员。今天我们学习还有另外一个base关键字,用来访问父类的成员。
例如base.Name,base.Method();等
问题:一个子类在继承了父类之后,两者的构造函数又有什么样的关系呢?
我们带着这个问题来进行一段测试:
最后运行得出这样的结果:
所以,在创建子类的实例的同时,先执行父类的构造函数,再执行子类的构造函数,这是显而易见的结果。
但是我们在实例化子类的时候,会自动调用父类的无参构造函数,实际上父类的构造函数好像并没有起到什么作用呀。
因此我们可以使用base关键字来显示调用父类的带参构造函数:
A1,A2,A3都继承于A类,通过三个子类的带参构造函数,利用base关键字来进行类的初始化工作
父类的成员:
子类A1:
子类A2:
子类A3:
最后运行的结果是:
节约了许多不必要的初始化代码,对吧?
protected关键字
如果我们希望将属性隐藏不让其他类访问,我们可以给父类的属性设为private,但这样的话子类也就不能够访问了,要是设为public的话,所有的类都能访问这个属性,这也不符合我们的要求,那有没有什么办法能够限制其他非子类的访问呢?
C#提供了一种访问修饰符protected。它表示受保护的,这样修饰属性的话,只能在父类和子类之间访问,其他类就不能再访问了。
下面的表格是public、private和protected修饰符的访问限制区别
修饰符 |
类的内部 |
子类 |
其他类 |
public |
可以访问 |
可以访问 |
可以访问 |
private |
可以访问 |
不可以访问 |
不可以访问 |
protected |
可以访问 |
可以访问 |
不可以访问 |
多态
方法的重载,也是方法实现多态的一种表现
父类的虚方法方法。例如:public class A{ public virtual void Show(){} }
子类重写父类虚方法。 Public class A1{ public override void Show(){} }
子类重写父类方法的快捷方式:override+空格+选择
多态的表现
一、 可以给父类的方法以virtual关键字修饰,这样的方法称为虚方法,子类以override关键字修饰方法来重写父类的方法。
二、 定义父类变量,用子类对象来初始化父类变量。例如:A a = new A1();
本章总结
1. 子类继承父类,也可以说父类派生子类;子类和父类符合is a关系,即子类is a 父类;
2. 一个子类只能继承一个父类;一个子类又可以派生出多个子类;
3. 父类的虚方法能被子类重写,也能被子类的子类重写;
4. 子类可以重写父类的虚方法,也可以不重写父类的虚方法,使用关键字override重写;
5. 子类中,base关键字不能调用父类的私有成员(字段、属性和方法)
6. 子类如果不显式使用base关键字来调用父类构造函数,子类会隐式地使用base调用;
7. 通过base调用父类带参构造函数时,传递的参数必须要和父类中的要求一致
红豆带你从零学C#系列之:初识继承与多态的更多相关文章
- 红豆带你从零学C#系列之——初识C#
问题一:什么是C#? C#是微软公司在2000年新推出的一款运行在.NET Framework平台上面的编程语言,这个.NET Framework平台又怎么去理解呢?举个例子来说好了,一个土著族人只会 ...
- 红豆带你从零学C#系列—Visual Studio工具介绍、下载和安装
一.Visual Studio的下载 Visual Studio(简称VS)是微软的一套完整的开发工具集,集成了能够开发并运行如C#.C++.VB.F#等程序的开发环境,目前最新的版本是Visual ...
- 红豆带你从零学C#系列之:开始C#编程(二)
控制台程序开发之补充说明 你已经动手操作过我们上一篇文章中的控制台程序输入输出了吗朋友? 如果没有的话,强烈建议你先回去做一遍再来继续学习噢!上一篇文章地址:点击这里 一. 你问我答 问:代码是 ...
- 红豆带你从零学C#系列之:开始C#编程(一)
让我们开始学习C#编程吧 作者:红豆西米露 交流QQ:937802080 前面的文章里给大家介绍了C#语言的一些基本认识,现在我们来开始做一个小程序吧! 在这里以我们以“控制台应用程序”来作演示. P ...
- 红豆带你从零学C#系列之:使用集合组织相关数据
ArrayList(数组列表) Why:如果一个公司有5名员工,一般我们会用长度为5的对象数组来存储信息,但要是有新员工来了,5个长度的数组就不够用了,因此我们需要一种能够根据需要自动分配容量的动态数 ...
- 带你从零学ReactNative开发跨平台App开发(二)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- 带你从零学ReactNative开发跨平台App开发(一)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- 带你从零学ReactNative开发跨平台App开发(十一)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
随机推荐
- (转) iOS深入学习(Block全面分析)
本文翻译自苹果的文档,有删减,也有添加自己的理解部分. 如果有Block语法不懂的,可以参考fuckingblocksyntax,里面对于Block 为了方便对比,下面的代码我假设是写在ViewCon ...
- ftk学习记(icon篇)
[声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在開始今天的文章之前.我们还是先看一下上一节的效果图. 大家能够參照上一节的解说,是不是存在这种 ...
- C++顺序性容器、关联性容器与容器适配器
什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...
- ASP.NET MVC 学习之路-4
本文在于巩固基础 模型绑定 从URL 获取值 public ActionResult About(int id) { ViewBag.Id = id; return View(); } @{ View ...
- 自学SQL语言的例子(使用MySQL实现)
SQL语言作为一种数据库管理的标准语言有着极为广泛的应用场景,菜鸟入门选用的数据库软件是轻量级的免费(这个极为重要)的MySQL,下载链接如下:http://www.mysql.com/downloa ...
- mysql distinct&group by 应用
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...
- MySQL的group_concat与Oracle的wm_concat使用区别
Oracle的wm_concat在拼接时,如果字段内容为空结果为空,null类型相加不受影响. MySQL的group_concat拼接时,如果不设置Separator,字段内容为空时不会得到空的结果 ...
- 修改AspNetSqlMembershipProvider的密码规则
在AspNetSqlMembershipProvider中,默认的密码规则为长度大于等于7,并且包含1个除字母和数字外的特殊字符,这项规则主要由minRequiredPasswordLength和mi ...
- MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:NO)
1.关闭mysql # service mysqld stop2.屏蔽权限 # mysqld_safe --skip-grant-table 屏幕出现: Starting demo fro ...
- Oracle中针对中文进行排序[Z]
在oracle 9i之前,对中文的排序,是默认按2进制编码来进行排序的. 9i时增加了几种新的选择: 按中文拼音进行排序:SCHINESE_PINYIN_M 按中文部首进行排序:SCHINESE_RA ...