接口
你提供的文本详细解释了C#中的接口、抽象类和相关概念。以下是对这些内容的总结和一些补充:
接口 (Interface)
-
定义:
- 接口是一种完全抽象的类型,它只包含方法、属性、事件和索引器的声明,而不包含实现。
- 接口不能被实例化。
-
特点:
- 所有接口成员默认是公共的 (public)。
- 接口可以包含默认方法(C# 8.0 及以上版本)。
- 接口可以包含常量、静态字段和索引器声明,但不能包含事件。
-
用途:
- 定义一组相关功能的契约。
- 强制实现类遵循特定的行为规范。
- 支持多态性,允许同一个接口被多个不同的类实现。
抽象类 (Abstract Class)
-
定义:
- 抽象类是一种不能直接实例化的类,它可以包含抽象方法和非抽象方法。
- 抽象类可以有构造函数和析构函数。
-
特点:
- 抽象方法没有实现,只有声明,并且使用
abstract
关键字标记。 - 非抽象方法有实现。
- 抽象类可以包含字段、属性、索引器等成员。
- 抽象方法没有实现,只有声明,并且使用
-
用途:
- 作为基类提供通用的实现代码和方法。
- 强制子类实现某些抽象方法。
- 支持多态性,允许同一个抽象类被多个不同的类继承。
接口与抽象类的区别
-
语法和访问修饰符:
- 接口中的所有成员默认是公共的 (public),不能指定访问修饰符。
- 抽象类中的方法可以有实现,并且可以使用访问修饰符(如
public
、private
)。
-
继承关系:
- C# 只支持单继承,即一个类只能继承一个父类,但一个类可以实现多个接口。
- 抽象类可以包含非抽象成员和抽象成员。
-
实例化:
- 接口不能被实例化。
- 抽象类不能被实例化,但可以通过子类来实例化。
-
用途:
- 接口主要用于定义行为规范,强制实现类遵循特定的行为。
- 抽象类主要用于提供通用的实现代码和方法,支持多态性。
默认方法(Default Methods)
- 从 C# 8.0 开始,接口可以包含默认方法。默认方法有实现,并且可以被实现该接口的类重写。
示例
public interface IAnimal
{
void MakeSound(); // 抽象方法
default void Sleep() // 默认方法
{
Console.WriteLine("Sleeping...");
}
}
public abstract class Bird : IAnimal
{
public abstract void Fly(); // 抽象方法
public void MakeSound()
{
Console.WriteLine("Singing...");
}
}
public class Sparrow : Bird
{
public override void Fly()
{
Console.WriteLine("Sparrow is flying.");
}
public new void Sleep() // 显式实现接口方法
{
Console.WriteLine("Sparrow is sleeping.");
}
}
在这个示例中,IAnimal
接口包含一个抽象方法 MakeSound
和一个默认方法 Sleep
。Bird
抽象类实现了 IAnimal
接口并提供了 Fly
方法的实现。Sparrow
类继承了 Bird
并重写了 Fly
方法,并通过 new
关键字显式实现了 Sleep
方法。
希望这些总结和示例能帮助你更好地理解 C# 中的接口、抽象类以及它们之间的区别。