您的位置:首页 > 职场人生

黑马程序员_继承性

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的程序代码。

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>、期待与您交流!
----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: