接口(interface)
接口是一种纯抽象的类型,它只包含抽象方法、属性、索引器和事件的定义。接口不能包含实现,也不能被实例化。接口可以被实现(即继承),一个类可以实现多个接口,而且接口实现必须提供所有接口成员的具体实现。接口的主要作用是定义类型之间的契约,实现了接口的类必须按照接口定义的契约来实现它的成员,从而可以实现不同类型之间的通用性和互换性。
使用接口的主要场景是当你需要定义一组通用的规范或契约时。比如说,你可以定义一个 IDisposable 接口,规定实现该接口的类型必须实现 Dispose 方法,用于释放资源。又比如,你可以定义一个 IComparer 接口,规定实现该接口的类型必须实现 Compare 方法,用于比较两个对象的大小。
抽象类(abstract class)
抽象类是一种可以包含抽象方法、属性、索引器和实现方法的类,它不能被实例化,只能被继承。抽象类的主要作用是为了实现多态性,它可以为子类提供一组基础功能,并要求子类必须实现一些具体的方法。抽象类可以包含一些具体的实现,但同时也可以包含一些抽象的成员,子类必须实现这些抽象成员。
使用抽象类的主要场景是当你需要为子类提供一组基础功能,并要求子类必须实现一些具体的方法时。比如说,你可以定义一个 Animal 抽象类,规定所有动物都必须具有 Eat 和 Sleep 方法,但对于不同的动物,它们的实现方法是不同的,因此你可以定义一个 Dog 类和一个 Cat 类,分别继承 Animal 类,并实现它的抽象方法。
接口和抽象类都可以用来定义一组抽象的方法和属性,但它们的应用场景有所不同。当你需要定义一组通用的规范或契约时,应该使用接口;当你需要为子类提供一组基础功能,并要求子类必须实现一些具体的方法时,应该使用抽象类。