C# interface 学习笔记和Unity示例

C# interface 学习笔记和Unity示例

AssistedByChatGPT

居然没写过Interface的学习笔记,还蛮重要的所以补一篇。另外推荐看看抽象类和接口的区别

接口(Interface)概述

在C#中,接口(Interface)是一个定义了一系列方法和属性但不实现它们的引用类型。接口可以被任何类或结构体实现,这意味着实现接口的类型必须提供接口中定义的所有方法和属性的具体实现。接口是一种确保某些类遵循特定协议的方式,它们常用于实现多态和提供一个可由多个不相关的类实现的共同功能的模板。

接口的基本用法

  1. 接口声明:使用interface关键字进行声明。
  2. 成员:接口可以包含方法、属性、索引器和事件。这些成员都是隐式抽象的,且默认为public访问级别。
  3. 实现接口:类或结构体通过:符号实现一个或多个接口。
  4. 接口继承:接口可以从一个或多个其他接口继承,扩展功能。

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 定义一个接口
public interface IMovable
{
    void Move(float speed); // 方法
    bool IsMoving { get; }  // 属性
}

// 实现接口的类
public class Car : IMovable
{
    public bool IsMoving { get; private set; }

    public void Move(float speed)
    {
        // 实现移动的逻辑
        if(speed > 0)
        {
            IsMoving = true;
            Console.WriteLine("Car is moving at speed: " + speed);
        }
        else
        {
            IsMoving = false;
            Console.WriteLine("Car is not moving.");
        }
    }
}

// 使用接口
public class InterfaceExample
{
    static void Main()
    {
        IMovable movable = new Car();
        movable.Move(10); // 调用 Move 方法
        Console.WriteLine("Is the car moving? " + movable.IsMoving);
    }
}

在Unity中使用接口

想象一下一个游戏,有玩家、敌人和环境物体,比如箱子。所有这些都可以受到伤害,但是响应伤害的方式各不相同。例如:

  • 玩家可能会失去生命值,并播放受伤动画。
  • 敌人可能会被击退,并播放不同的受伤动画。
  • 箱子不会移动,但可能会损坏并最终破碎。

这些对象的共同点是它们都可以“受伤”。在不使用接口的情况下,你可能需要为每种对象编写不同的伤害处理代码,或者创建一个复杂的继承结构,这会增加代码的复杂性和维护难度。

使用接口,你可以简单地定义一个 IDamageable 接口,并在所有可以受伤的对象上实现它。接着,你可以编写一个通用的伤害处理函数,它可以对任何 IDamageable 对象施加伤害,而不必关心对象的具体类型。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public interface IDamageable
{
    void TakeDamage(int amount);
    void DisplayDamage();
}

public class Player : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        // 减少玩家生命值
    }

    public void DisplayDamage()
    {
        // 显示玩家受伤动画
    }
}

public class Enemy : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        // 减少敌人生命值
    }

    public void DisplayDamage()
    {
        // 显示敌人受伤动画
        // 敌人击退逻辑
    }
}

public class Box : MonoBehaviour, IDamageable
{
    public void TakeDamage(int amount)
    {
        // 减少箱子的完整度
    }

    public void DisplayDamage()
    {
        // 如果箱子损坏,播放破坏动画
    }
}

// 伤害处理逻辑
public class DamageController : MonoBehaviour
{
    public void ApplyDamage(IDamageable damageable, int amount)
    {
        damageable.TakeDamage(amount);
        damageable.DisplayDamage();
    }
}

在这个例子中,DamageController 可以处理任何实现了 IDamageable 接口的对象。这种方法意味着你可以编写一次伤害处理逻辑,并将其应用于所有可受伤的对象,无论它们是玩家、敌人还是任何其他类型的对象。这极大地提高了代码的重用性,使其更易于管理和扩展。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus