No title

接口和抽象类

1. 定义和用途

  • 接口(Interface):
    • 定义:接口是一个只能包含方法签名、属性、事件和索引器的类型声明。接口不能包含字段(除非是静态字段),也不能有实现。
    • 用途:接口用于定义类的公共合同。实现了某个接口的类必须提供该接口中定义的所有方法的实现。
  • 抽象类(Abstract Class):
    • 定义:抽象类是一个不能被实例化的类,可以包含方法实现、字段、属性、构造函数等。它可以包含完全实现的方法(非抽象方法)以及抽象方法(没有实现的方法)。
    • 用途:抽象类用于提供一个基本的实现和共享的功能,这些功能可以被派生类继承和重用。抽象类用于建立一个共同的基类,为多个派生类提供基础功能。

2. 继承和实现

  • 接口:

    • 实现:一个类可以实现多个接口(多重继承)。接口的实现是通过 : 符号进行的,例如:class MyClass : IMyInterface { ... }。有两种方式:1,隐式实现,2显示实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      // 定义接口
      public interface IExample
      {
      void Display();
      }
      // 类实现接口的隐式实现
      public class ExampleClass : IExample
      {
      // 隐式实现接口方法
      public void Display()
      {
      Console.WriteLine("This is an implicit implementation of Display.");
      }
      }

      public class ExampleClass : IExample
      {
      // 显式实现 IExample 接口的方法
      void IExample.Display()
      {
      Console.WriteLine("This is an explicit implementation of IExample.Display.");
      }
      }
    • 继承:接口之间可以继承自其他接口,但接口不能继承自类,先继承,再实现。

  • 抽象类:

    • 继承:一个类只能继承一个抽象类(单继承)。抽象类的继承是通过 : 符号进行的,例如:class MyClass : MyBaseClass { ... }
    • 实现:抽象类可以实现接口,并且可以通过实现这些接口来定义其公共合同。

3. 成员

  • 接口:

    • 只能包含方法签名、属性、事件、索引器的声明。接口成员默认是 public,不允许添加访问修饰符。

    • 不能包含字段(静态字段和常量除外),也不能包含构造函数或析构函数。

    • 语法特征

      1
      2
      3
      4
      [public] interface I...able
      {
      方法;
      }
  • 抽象类:

    • 可以包含字段、构造函数、析构函数、方法(包括抽象方法和非抽象方法)、属性、事件等。
    • 抽象类的成员可以有不同的访问修饰符(publicprotectedprivate)。

4. 构造函数和析构函数

  • 接口: 不支持构造函数或析构函数。

  • 抽象类: 可以有构造函数和析构函数。抽象类可以在其构造函数中初始化字段等。

    调用抽象类里面的非抽象方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using System;

    // 定义抽象类
    public abstract class Animal
    {
    // 非抽象方法(具有实现)
    public void Eat()
    {
    Console.WriteLine("Eating...");
    }

    // 抽象方法(没有实现)
    public abstract void MakeSound();
    }

    // 从抽象类派生的具体子类
    public class Dog : Animal
    {
    // 实现抽象方法
    public override void MakeSound()
    {
    Console.WriteLine("Woof!");
    }
    }

    public class Program
    {
    public static void Main()
    {
    // 创建子类的实例
    Dog myDog = new Dog();

    // 调用抽象类中的非抽象方法
    myDog.Eat(); // 输出 "Eating..."

    // 调用实现的抽象方法
    myDog.MakeSound(); // 输出 "Woof!"
    }
    }