OneBigLoser
OneBigLoser
发布于 2024-07-15 / 8 阅读
0
0

抽象类与接口的区别

抽象类(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");
    }
}

练习题目

基础题目

  1. 创建一个抽象类 Shape,包含一个抽象方法 Draw() 和一个非抽象方法 Move().

  2. 定义一个接口 IDriveable,包含方法 Drive().

更有难度的题目

  1. 定义一个抽象类 Vehicle 和接口 IElectricPowered。让 Car 类继承 Vehicle 并实现 IElectricPowered 接口。

  2. 实现一个接口 IStorage 和抽象类 Database,然后让 FileStorageSQLDatabase 类实现或继承它们,并定义必要的方法如 SaveData()LoadData()


评论