【知识要点】
(1)继承
(2)继承种类
【问题提出】
继承作为面向对象编程至关重要的一个概念,但总感觉很抽象,如何理解呢?
【在线指导】
回到我们现实生活中来,我们都知道或者听说过:种瓜得瓜、种豆得豆,还有:龙生龙,凤生凤,老鼠生来会打洞,如果在生物学上我们称之为遗传,专业一点会研究DNA序列,那么把这个搬到我们的编程上,就是继承。
在面向对象程序设计语言中,针对“继承”机制,常使用以下基本术语:
(1)基类:指被继承的类,也就是父类。通过继承,用户可以重用父类的代码,而只需专注编写子类的新代码。
(2)派生类:指通过继承基类而创建的新类,也就是子类。
派生类直接继承其基类成员,并隐式包含其直接基类中除构造函数和析构函数外的所有成员。 继承具有可传递性。如果由A类派生出B类,又由B类派生出C类,则C类会继承B类和A类中定义的所有类成员(不含构造函数和析构函数)。
派生类可在其基类的基础上添加新成员,但它不能删除所继承的成员的定义。
在派生类中,可以通过定义与所继承的基类成员具有相同名称或标识符的新成员来隐藏所继承的成员,从而使所继承的成员在派生类中不可被访问。 派生类与其基类之间存在着隐式转换关系,所以对派生类实例的引用,可以看作是对其基类实例的引用。
语法如下:
class 派生类名:基类名 { //派生类代码 }
现在我们构造一个Student作为基类,然后增加团员类,由于团员除了有其本身的特点外,还具有学生的所有属性,所以我们利用继承机制在团员类中重用学生类的成员,同时在团员类中再补充新的成员。具体实现过程如下:
学生类代码如下:
public class Student //定义一个学生类
{
private string StudentId; //定义私有变量成员:学号
private string StudentName; //定义私有变量成员:学生姓名
public Student()
{
}
public Student(string id, string name)//构造函数
{
StudentId =id;
StudentName =name;
}
public string Learn() //用于访问私有变量student_id的属性
{
return("努力学习!"); //添加学习的代码;
}
}
团员类代码如下:
public class Member:Student //定义Student类的派生类Member,它继承 Student类
{
public Member()
{
}
public string Activity()
{
return("参加团员活动!");
}
}
1、设计界面
(1)打开Hello项目,单击“启动页>最近使用的项目>Hello”。
(2)在“解决方案资源管理器”中添加“Class-Inherit.aspx”页面。
(3)从工具箱中拖1个按钮Button到Class-Inherit.aspx页面。
从工具箱中添加“继承”按钮,其ID属性为“btnClassInherit”。
2、添加代码
(1)双击页面上的“继承”按钮。
public class Student //定义一个学生类
{
private string StudentId; //定义私有变量成员:学号
private string StudentName; //定义私有变量成员:学生姓名
public Student()
{
}
public Student(string id, string name)//构造函数
{
StudentId =id;
StudentName =name;
}
public string Learn() //用于访问私有变量student_id的属性
{
return("努力学习!"); //添加学习的代码;
}
}
public class Member:Student //定义Student类的派生类Member,它继承 Student类
{
public Member()
{
}
public string Activity()
{
return("参加团员活动!");
}
}
我们在btnClassInherit_Click()中间输入:
Member Liming = new Member();
Response.Write(Liming.Learn());
Response.Write(Liming.Activity());
(5)单击“继承”按钮。
我们知道,在团员类Member中我们并没有声明Learn()成员函数,但是由于它继承自学生类Student,所以它可以调用父类的成员函数或成员变量,这就是继承的好处。
问:我会实现继承,但是不知道继承什么时候需要,什么时候不需要?
答:一般来说,如果一个类需要用到另外一个类的大部分方法和属性,但又有自己特有的方法和属性,就可以用继承;反之不需要。