黑马程序员_继承性
2013-12-22 16:50
225 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
继承作为面向对象的重要思想之一,其最终目的是使得设计程序变得简单。在以往的时间中,程序设计者们编写了若干程序,即便是个人在过去的时间中也编写了不少程序,当编写新的程序时,自然想到的是利用已有的代码,以便省时省力。
如何复用已有的代码成为当时程序设计者的问题,其中以如何高效、方便复用为标杆,成为当时热门讨论的问题。在以往的面向过程程序设计程序复用中:有库函数调用,较为突出的是MFC 编程;有模块调用等。其中出现的问题是不能修改原有的内容、不能添加新的内容,由此出现了面向对象的继承。
世间的事物既存在共性,也存在差异。而程序是是对问题或者事物的一种模拟也叫做抽象,为了描述各种事物便提出以层次结构对其进行抽象,而继承便是描述各层次之间的关系。比如对学生这个概念进行描述,可以知道所有的学生都是人,而学生又有本科生与硕士生。
采用面向对象的思想,可以首先定义人类(Person),而学生都是人;所以在定义学生类(Student)时就继承人类(person),继承人的所有属性、行为;在定义本科生(Undergraduate)与硕士生(Master)时,由于其前提是学生,所以都需继承学生类。其关系图1如下所示。
图1 继承关系
下面介绍C#的继承机制的特性。
1 单继承性
C#只支持单继承,不允许多重继续,即继承类只能有一个直接父类;但允许多层继承,如前面的本科生继承了学生,而学生又继承了人;不过它又禁止循环继承,简单一点是不允许 A 继承 B,而 B 有继承 A;但在需要多重继承时,可以通过接口来实现,C# 对接口数量的继承没有限制。
在 C++ 中是允许多重继承的,但在C# 中是不允许的,是因为当一个类从多个基类继承过来时,往往会带来许多新的问题,从而抵消了这种多重继承的灵活性,同时C# 的意图旨在简化C++ 的繁琐性,所以便不支持多重继承。
2 子类继承父类成员
子类继承父类除构造、析构函数意外的所有成员,仅只是有些父类成员由于权限的限制,在子类中不能够访问。在子类中可以定义与继承来的成员同名的新成员,这样新的成员就覆盖了父类中旧的成员,从而起到更新了基类的效果,但子类中的定义不会作用至父类,即不会更改父类中的定义。并且如果有需要可以添加新的成员,以实现其特定效果,如学生类添加学生可以学习的方法。
3 构造、析构函数
在子类中如果需要调用父类构造函数,则需使用 base 关键字。如果子类没有显示调用父类构造函数,也没有使用 this 关键字调用重载构造函数,则子类在生成对象实例时,会默认调用父类无参构造函数,但如果父类没有无参构造函数,则会在编译时报错。
4 继承产生多态性
在父类中可以使用 virtual定义虚方法、虚属性和虚索引指示器,而在子类中重载这些虚方法,则可以产生编译时多态,进而实现各种编程要求。
下面则是实现图1的程序代码。
运行结果如下:
CH
20
studing
choice course
A
22
stuing
write paper
参考
http://hi.baidu.com/xiaoheilong/item/0bf9bdd5664a722839f6f795
C# 编程指南
C# 自学手册
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
----------------------
继承作为面向对象的重要思想之一,其最终目的是使得设计程序变得简单。在以往的时间中,程序设计者们编写了若干程序,即便是个人在过去的时间中也编写了不少程序,当编写新的程序时,自然想到的是利用已有的代码,以便省时省力。
如何复用已有的代码成为当时程序设计者的问题,其中以如何高效、方便复用为标杆,成为当时热门讨论的问题。在以往的面向过程程序设计程序复用中:有库函数调用,较为突出的是MFC 编程;有模块调用等。其中出现的问题是不能修改原有的内容、不能添加新的内容,由此出现了面向对象的继承。
世间的事物既存在共性,也存在差异。而程序是是对问题或者事物的一种模拟也叫做抽象,为了描述各种事物便提出以层次结构对其进行抽象,而继承便是描述各层次之间的关系。比如对学生这个概念进行描述,可以知道所有的学生都是人,而学生又有本科生与硕士生。
采用面向对象的思想,可以首先定义人类(Person),而学生都是人;所以在定义学生类(Student)时就继承人类(person),继承人的所有属性、行为;在定义本科生(Undergraduate)与硕士生(Master)时,由于其前提是学生,所以都需继承学生类。其关系图1如下所示。
图1 继承关系
下面介绍C#的继承机制的特性。
1 单继承性
C#只支持单继承,不允许多重继续,即继承类只能有一个直接父类;但允许多层继承,如前面的本科生继承了学生,而学生又继承了人;不过它又禁止循环继承,简单一点是不允许 A 继承 B,而 B 有继承 A;但在需要多重继承时,可以通过接口来实现,C# 对接口数量的继承没有限制。
在 C++ 中是允许多重继承的,但在C# 中是不允许的,是因为当一个类从多个基类继承过来时,往往会带来许多新的问题,从而抵消了这种多重继承的灵活性,同时C# 的意图旨在简化C++ 的繁琐性,所以便不支持多重继承。
2 子类继承父类成员
子类继承父类除构造、析构函数意外的所有成员,仅只是有些父类成员由于权限的限制,在子类中不能够访问。在子类中可以定义与继承来的成员同名的新成员,这样新的成员就覆盖了父类中旧的成员,从而起到更新了基类的效果,但子类中的定义不会作用至父类,即不会更改父类中的定义。并且如果有需要可以添加新的成员,以实现其特定效果,如学生类添加学生可以学习的方法。
3 构造、析构函数
在子类中如果需要调用父类构造函数,则需使用 base 关键字。如果子类没有显示调用父类构造函数,也没有使用 this 关键字调用重载构造函数,则子类在生成对象实例时,会默认调用父类无参构造函数,但如果父类没有无参构造函数,则会在编译时报错。
4 继承产生多态性
在父类中可以使用 virtual定义虚方法、虚属性和虚索引指示器,而在子类中重载这些虚方法,则可以产生编译时多态,进而实现各种编程要求。
下面则是实现图1的程序代码。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 继承 { //人类 public class Person { protected string name; protected int age; public Person(string name, int age) { this.name = name; this.age = age; } public Person() { } public void getInfo() { Console.WriteLine(name); Console.WriteLine(age); } } //学生类 public class Student : Person { protected string school; public Student(string name, int age, string school):base(name, age) { this.school = school; } public Student() { } public void study() { Console.WriteLine("studing"); } } //本科生类 public class Undergraduate : Student { protected string profession; public Undergraduate(string name, int age, string school, string profession) : base(name, age, school) { this.profession = profession; } public void choiceCourse() { Console.WriteLine("choice course."); } } //硕士生类 public class Master : Student { protected string tutor; public Master(string name, int age, string school, string tutor) : base(name, age, school) { this.tutor = tutor; } public void writePaper() { Console.WriteLine("write paper."); } } class Program { static void Main(string[] args) { //定义对象 Undergraduate undergraduate = new Undergraduate("CH", 20, "CD", "computer"); Master master = new Master("A", 22, "CD", "computer"); //调用方法 undergraduate.getInfo(); undergraduate.study(); undergraduate.choiceCourse(); master.getInfo(); master.study(); master.writePaper(); } } }
运行结果如下:
CH
20
studing
choice course
A
22
stuing
write paper
参考
http://hi.baidu.com/xiaoheilong/item/0bf9bdd5664a722839f6f795
C# 编程指南
C# 自学手册
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流!
----------------------
相关文章推荐
- 黑马程序员_java的继承性- 继承-final关键字-抽象类-接口-多态-异常-包-多线程-
- 黑马程序员-继承性、多态性
- 黑马程序员 - Java 高新技术1
- 黑马程序员——交通灯管理系统
- 黑马程序员入学考试评分细则
- 黑马程序员:OC三大特性
- 黑马程序员--【强哥笔记】系列之Java高新技术笔记之类加载器(第7天)
- 黑马程序员——IO包中的其他类
- 黑马程序员--OC--分类和重新定义description方法
- 黑马程序员——Java 基础:多线程
- 黑马程序员_学习日记七_集合二
- 黑马程序员--break与continue
- 黑马程序员-集合(Set)
- 黑马程序员_交通灯管理系统学习笔记
- 黑马程序员-iOS学习日记(九)Block&Protocol
- 黑马程序员 JAVA基础--GUI
- 黑马程序员--iOS-OC基本语法
- 黑马程序员—基础—反射
- 黑马程序员——泛型的总结
- 黑马程序员-java io(Input Output)流