C#入门系列 -- 面向对象之继承
基础概念
继承、封装和多态性是面向对象编程的三个主要特性。
继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。继承就是在一个已存在的类的基础上建立一个新的类。已经存在的类称为父类或基类,新建立的类称为子类或派生类。子类或派生类从父类那里获得其特性的现象称为继承。
派生类只能有一个直接基类,即不支持多继承。C#支持多级继承,即允许派生类作为新的基类来产生新的派生类。
一般来说,基类抽取了派生类的共同特征,而派生类通过增加信息将抽象的基类变为某种具体的类型,派生类是基类定义的延续,是对基类的具体化。
C#中所有类都默认继承自object类。
派生类定义
派生类的定义和类的定义基本一致,只是在类名后面多了:基类名
。
定义形式为:
访问修饰符 class 派生类名 : 基类名
{
成员列表;
}
经典示例:
人类和学生类
/// <summary>
/// 基类
/// </summary>
class Person
{
// 基类成员 -- 姓名
public string Name;
// 基类成员 -- 年龄
public int Age;
}
/// <summary>
/// 派生类
/// </summary>
class Student : Person
{
// 派生类成员 -- 学校
public string School;
}
派生类的成员由两部分构成,一部分是从基类继承得到的,另一部分是自己定义的新成员。
派生类的成员访问属性仍然可以public,private,protected,internal,protected internal进行修饰。
派生类访问
对于从基类继承的成员,有以下几条规则:
- 基类中声明为private的成员虽然可以被派生类继承,但是不能被派生类成员和派生类用户访问;
- 基类中声明为protected的成员可以被派生类成员访问,但是不能被派生类用户访问;
- 基类中声明为protected internal的成员可以被同一个程序中的派生类成员访问;
- 基类中声明为internal的成员可以被同一个程序中的派生类成员和派生类用户访问;
- 基类中声明为public的成员在派生类中访问同样不受限制。
代码示例:
class Program
{
static void Main(string[] args)
{
Student st = new Student();
// 访问从基类继承的公有成员
st.Name = "Czhenya";
// 访问派生类公开成员
st.School = "JunJin";
Console.ReadLine();
}
}
class Person
{
// 基类成员 -- 姓名
public string Name;
// 基类成员 -- 年龄
public int Age;
}
class Student : Person
{
// 派生类成员 -- 学校
public string School;
}
派生类的构造和析构函数
派生类没有继承基类的构造函数和析构函数。
如果要对派生类的成员进行初始化,需要编写派生类的构造函数。如果要释放派生类对象时同样需要调用派生类自己的析构函数。
-
派生类的构造函数
-
在设计派生类的构造函数时,需要考虑派生类新增成员和从基类继承的数据成员的初始化。
-
默认情况下,创建派生类的实例时,基类的无参数构造函数被调用。
-
可设置派生类使用指定的基类构造函数,派生类的构造函数
定义如下:
public 派生类名称(参数列表) : base(要调用的基类构造函数的参数列表)
{
函数体
}
创建派生类的对象时,会先调用基类的构造函数,再调用派生类的构造函数。
- 派生类的析构函数
-
在派生类中定义的析构函数用来完成对派生类中新增加的资源的清理工作,基类所申请的资源仍然由基类的析构函数来清理。
-
系统会自动调用派生类的析构函数和基类的析构函数完成对象的清理工作。
-
销毁派生类对象时,会先调用最派生类的析构函数,然后按照备份从低到高依次调用中间基类的析构函数,一直到备份最高的基类析构函数被执行。
- 点赞
- 收藏
- 关注作者
评论(0)