抽象类(Abstract Class)和接口(Interface)都是面向对象编程中用于实现抽象和多态的工具。它们有一些相似之处,也有一些关键的区别。
基本概念
抽象类:
抽象类是不能被实例化的类,意味着你不能直接创建一个抽象类的对象。
抽象类中可以包含抽象方法(没有实现的方法)和非抽象方法(有实现的方法)。
抽象类用于为子类提供一个基本的模板,子类需要实现抽象方法。
接口:
接口是一种特殊类型,只包含方法和属性的声明,不包含任何实现。
实现接口的类必须实现接口中的所有方法。
接口支持多重继承,即一个类可以实现多个接口。
语法规则和如何声明
抽象类:
public abstract class Animal { public abstract void Eat(); public void Breathe() { Console.WriteLine("I can breathe."); } }
接口:
public interface IAnimal { void Eat(); }
优点和缺点
抽象类:
优点:
可以包含部分实现(具体方法或属性实现)。
可以使用构造函数。
缺点:
只能单一继承,一个类只能继承一个抽象类。
接口:
优点:
支持多重实现,一个类可以实现多个接口。
提供了非常清晰的方法和属性声明规范。
缺点:
不能包含任何方法实现。
不能声明构造函数或字段。
示例代码
抽象类示例:
public abstract class Bird
{
public abstract void MakeSound();
public void Fly()
{
Console.WriteLine("I'm flying!");
}
}
public class Sparrow : Bird
{
public override void MakeSound()
{
Console.WriteLine("Chirp chirp");
}
}
接口示例:
public interface IFlyable
{
void Fly();
}
public class Bird : IFlyable
{
public void Fly()
{
Console.WriteLine("Bird is flying");
}
}
public class Airplane : IFlyable
{
public void Fly()
{
Console.WriteLine("Airplane is flying");
}
}
练习题目
基础题目
创建一个抽象类
Shape
,包含一个抽象方法Draw()
和一个非抽象方法Move()
.定义一个接口
IDriveable
,包含方法Drive()
.
更有难度的题目
定义一个抽象类
Vehicle
和接口IElectricPowered
。让Car
类继承Vehicle
并实现IElectricPowered
接口。实现一个接口
IStorage
和抽象类Database
,然后让FileStorage
和SQLDatabase
类实现或继承它们,并定义必要的方法如SaveData()
和LoadData()
。