Post

C# 学习笔记 —— 类和接口

C# 学习笔记 —— 类和接口

自从上次跟着刘铁猛老师的视频学习 C# 之后,已经隔了很长很长时间没有练习编程了,主打一个三天打鱼两天晒网 ( ̄ε (# ̄),现在抽空整理复习一下。

类的声明

类可以声明在命名空间中或者作为成员类声明在类体里,不推荐声明在全局命名空间。声明类有三个必要的元素:class 关键字、类名和类体,如下是最基本的类声明格式。

1
2
3
4
namespace Practice {
    class Student {
    }
}

类与对象的关系

对象也叫实例,是类经过实例化得到的内存中的实体,可以使用 new 操作符创建类的实例。类是引用类型,创建一个类的实例时,会在堆上分配内存,变量保存的是实例的引用。

1
Student stu = new Student();

类和类成员的访问级别控制

  • 类的访问级别默认为 internal,将类限制为只在同程序集内可以访问
  • public 修饰的类可以在其他程序集中访问

  • 类成员的访问级别默认为 private,只能在类体里访问
  • public 修饰的类成员可以被外部的类访问,但是以所属的类的访问级别为上限
  • internal 修饰的类成员可以在同程序集内访问
  • protected 修饰的类成员在该类的内部和继承类中可以访问

继承

继承指派生类在接收基类所有成员(除了构造和析构函数之外)的基础上进行类成员数量的扩充类成员版本的更新

sealed 修饰的类不能被继承。一个类只能继承一个基类,但可以实现多个基接口。派生类的访问级别不能超过基类。

实例被创建时,先调用基类构造函数,再调用派生类构造函数;实例被销毁时,先调用派生类析构函数,再调用基类析构函数。

虚方法、重写和多态

在基类中声明一个虚方法,派生类可以重写该方法来实现自己的版本,在基类中使用关键字 virtual 声明虚方法,同时在继承类中用关键字 override 声明重写虚方法,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program {
    static void Main(string[] args) {
        Vehicle v1 = new Vehicle();
        v1.Run(); // 输出 I'm running.

        Vehicle v2 = new Car();
        v2.Run(); // 输出 Car is running.
    }
}

class Vehicle {
    public virtual void Run() {
        Console.WriteLine("I'm running.");
    }
}

class Car : Vehicle {
    public override void Run() {
        Console.WriteLine("Car is running.");
    }
}

多态主要通过虚方法、抽象类和接口来实现,使得同一个方法根据对象类型的不同,具有不同的表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

抽象类和接口

抽象类专门作为基类使用(复用,解耦),需要使用关键字 abstract 声明抽象类和抽象方法。抽象类的逻辑未完全实现,既可以提供抽象方法,也可以提供非抽象方法。它的派生类实现抽象方法时在方法前要用 override 修饰。接口通过关键字 interface 声明,完全未实现逻辑,接口成员的默认访问级别为 public,逻辑由它的派生类实现。抽象类和接口都不能被实例化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
interface IVehicle {
    void Run();
    void Stop();
}

abstract class Vehicle : IVehicle {
    public abstract void Run();

    public void Stop() {
        Console.WriteLine("Stopped");
    }
}

class Car : Vehicle {
    public override void Run() {
        Console.WriteLine("Car is running.");
    }
}

class Truck : Vehicle {
    public override void Run() {
        Console.WriteLine("Truck is running.");
    }
}
This post is licensed under CC BY 4.0 by the author.