写点什么

C#入门系列 (二十一) -- 面向对象之继承

作者:陈言必行
  • 2022 年 6 月 21 日
  • 本文字数:1437 字

    阅读完需:约 5 分钟

基础概念

继承、封装和多态性是面向对象编程的三个主要特性。


  继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。继承就是在一个已存在的类的基础上建立一个新的类。已经存在的类称为父类或基类,新建立的类称为子类或派生类。子类或派生类从父类那里获得其特性的现象称为继承。


派生类只能有一个直接基类,即不支持多继承。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 进行修饰。



派生类访问

对于从基类继承的成员,有以下几条规则:


  1. 基类中声明为 private 的成员虽然可以被派生类继承,但是不能被派生类成员和派生类用户访问;

  2. 基类中声明为 protected 的成员可以被派生类成员访问,但是不能被派生类用户访问;

  3. 基类中声明为 protected internal 的成员可以被同一个程序中的派生类成员访问;

  4. 基类中声明为 internal 的成员可以被同一个程序中的派生类成员和派生类用户访问;

  5. 基类中声明为 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;}
复制代码



派生类的构造和析构函数

派生类没有继承基类的构造函数和析构函数。


如果要对派生类的成员进行初始化,需要编写派生类的构造函数。如果要释放派生类对象时同样需要调用派生类自己的析构函数。


  1. 派生类的构造函数

  2. 在设计派生类的构造函数时,需要考虑派生类新增成员和从基类继承的数据成员的初始化。

  3. 默认情况下,创建派生类的实例时,基类的无参数构造函数被调用。


可设置派生类使用指定的基类构造函数,派生类的构造函数


定义如下:


public 派生类名称(参数列表) : base(要调用的基类构造函数的参数列表){    函数体}
复制代码


创建派生类的对象时,会先调用基类的构造函数,再调用派生类的构造函数。


  1. 派生类的析构函数

  2. 在派生类中定义的析构函数用来完成对派生类中新增加的资源的清理工作,基类所申请的资源仍然由基类的析构函数来清理。

  3. 系统会自动调用派生类的析构函数和基类的析构函数完成对象的清理工作。


销毁派生类对象时,会先调用最派生类的析构函数,然后按照备份从低到高依次调用中间基类的析构函数,一直到备份最高的基类析构函数被执行。

发布于: 18 小时前阅读数: 7
用户头像

陈言必行

关注

公号:开发同学留步 2019.03.12 加入

我是一个从事Unity游戏开发攻城狮,6年开发经验,助你日常不加班。

评论

发布
暂无评论
C#入门系列(二十一) -- 面向对象之继承_C#_陈言必行_InfoQ写作社区