C# 接口(Interface)和抽象类(Abstract Class)区别和详细使用案例

文章目录

  • 区别:
    • 1. **定义**:
    • 2. **继承与实现**:
    • 3. **成员**:
    • 4. **目的**:
  • 使用示例:
    • - **接口使用场景**:
    • - **抽象类使用场景**:

在C#中,接口(Interface)和抽象类(Abstract Class)都是为了支持面向对象编程中的多态性和实现类之间的共同特性而设计的。它们的主要区别、使用场景以及举例说明如下:

区别:

1. 定义

  • 接口:接口是一个完全抽象的类型,它仅包含方法、属性、索引器、事件等成员的签名,但不提供任何实现。接口用interface关键字定义。
  • 抽象类:抽象类是一种可以包含抽象方法和/或具体方法及成员变量的类,它可以有自己的部分实现。抽象类用abstract关键字定义,并且不能直接实例化。

2. 继承与实现

  • 接口:一个类可以实现多个接口,通过:关键字后跟接口名称列表并使用implements关键字(在C#中只需:即可)。
    public class MyClass : IMyInterface1, IMyInterface2
    {
        // 实现接口的方法...
    }
    
  • 抽象类:一个类只能从一个抽象类派生(单继承),并且必须实现所有未实现的抽象方法,使用:关键字。
    public abstract class MyBaseClass
    {
        public abstract void AbstractMethod();
        public void ConcreteMethod() { ... } // 具体方法
    }
    
    public class MyDerivedClass : MyBaseClass
    {
        public override void AbstractMethod() {...} // 必须实现抽象方法
    }
    

3. 成员

  • 接口:接口中所有方法默认是抽象的,不允许有实例字段(变量),但是可以有属性,且属性必须声明为自动实现的属性(C# 8.0 及以上版本允许有静态和非抽象的实例属性)。
  • 抽象类:可以有抽象方法(没有实现)、具体方法(有实现)、字段、属性、构造函数(尽管不能实例化抽象类,但可以用于初始化子类的实例变量)。

4. 目的

  • 接口:主要用于定义一组行为规范,强调的是“这个对象能做什么”,实现接口的对象保证了具备特定功能的能力。
  • 抽象类:更多地用于表示类的层级结构和共享代码,它可以定义类的基本结构,同时约束子类必须实现某些功能,还可以包含一些共性的具体实现。

使用示例:

- 接口使用场景

假设有一个动物王国,需要定义飞翔、游泳、奔跑的行为,这时可以用接口来描述这些行为:

interface IFlyable
{
    void Fly();
}

interface ISwimable
{
    void Swim();
}

interface IRunable
{
    void Run(int distance);
}

class Bird : IFlyable, IRunable
{
    public void Fly() {...}
    public void Run(int distance) {...}
}

class Fish : ISwimable
{
    public void Swim() {...}
}

这里,BirdFish各自实现了符合其特性的接口。

- 抽象类使用场景

在动物园管理系统中,所有的动物都有名字和年龄,但具体的喂养方式可能因动物种类不同而异,此时可以使用抽象类:

abstract class Animal
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public abstract void Feed(); // 抽象方法,由子类实现
    
    protected void Log(string message) // 共享的具体方法
    {
        Console.WriteLine($"Animal: {Name}, Action: {message}");
    }
}

class Lion : Animal
{
    public override void Feed()
    {
        Log("Fed with meat");
    }
}

class Giraffe : Animal
{
    public override void Feed()
    {
        Log("Fed with leaves");
    }
}

这里,Animal抽象类提供了通用属性和一个抽象方法Feed,各个具体动物类如LionGiraffe根据自身特点实现了Feed方法。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

你可能感兴趣的:(c#,java,开发语言,unity,游戏引擎)