C# 继承
继承,它允许根据一个类来定义另一个类,这样使得创建和维护程序变得相对容易,同样也有利于代码的重用。
在创建一个类时,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新类,这个新类继承已有类即可。这个已有类叫做基类,新生成的类叫做派生类。
继承的思想是实现了属于(is-a)的关系。
基类和派生类
一个派生类只能有一个直接基类,但一个基类可以有多个直接派生类。
继承是可以传递的,定义要从其他类派生的类时,派生类会隐式获得基类的所有成员(这些成员不包含构造函数和析构函数)。派生类因而可以重用基类中的代码,而无需重新实现。在派生类中,可以再自行去添加更多成员,这样派生类就扩展了基类的功能。
C#创建派生类的语法:
<access_specifier> class <base_class>
{
……
}
class <derived_class>:<base_class>
{
……
}
使用Visual Studio新建项目:chapter12_001
新建一个Person类:
class Person
{
protected long id; //身份ID
protected string name; //姓名
public void setId(long id)
{
this.id = id;
}
public void setName(string name)
{
this.name = name;
}
}
新建一个Student类,这个类从Person类继承而来
class Student:Person
{
public void Display()
{
Console.WriteLine("ID:{0};name:{1}",id,name);
}
}
在有IDE生成的类中的Main方法中添加如下代码:
Student stu = new Student();
stu.setId(100001);
stu.setName("xiesheng");
stu.Display();
Console.ReadKey();
编译运行后的结果如下:
基类的初始化:
派生类新继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。可以在成员初始化列表中进行父类的初始化。
在Person类中新增构造函数:
//Perosn构造函数
public Person(long id, string name)
{
this.id = id;
this.name = name;
}
在子类中需要使用初始化列表来进么初始化,Student类改造后如下:
class Student:Person
{
private string school;
public Student(long id, string name, string school) : base(id, name)
{
this.school = school;
}
public void Display()
{
Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);
}
}
IDE生成类中的Main方法改造为如下:
Student stu = new Student(100001, "xiesheng","西安交通大学");
stu.Display();
Console.ReadKey();
编译运行后的结果如下:
C#中多重继承:
C#不支持多重继承,但是,可以通过使用接口来实现多重继承。
在工程中新增接口interface:
interface exam
{
string getGrade(double en,double hn,double po);
}
Student继承这个接口,则需要对接口中的方法进行实现
改造Student类如下:
class Student:Person,exam
{
private string school;
private string grade;
public Student(long id, string name, string school) : base(id, name)
{
this.school = school;
}
public void steGrad(string grade)
{
this.grade = grade;
}
public void Display()
{
Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);
Console.WriteLine("考试结果:{0}", grade);
}
//对接口实现
public string getGrade(double en, double hn, double po)
{
if (en < 60 || hn < 60 || po < 60)
{
return "Fail";
}
else
{
return "Pass";
}
}
}
在IDE生成的Main方法做如下测试调用:
Student stu = new Student(100001, "xiesheng","西安交通大学");
stu.steGrad(stu.getGrade(60.1, 90.5, 60.0));
stu.Display();
Console.ReadKey();
编译运行后的结果如下: