[Unity 代码写法整理]接口Interface的使用

1.作为委托去使用。

Java中没有委托,只有接口。所以接口能代替委托的功能。

interface IActionCallback
{
    void Callback();
}

约等于委托

Action Callback

为什么是约等于,是因为委托有个特性是可以+=和-=,但是接口只能用=号去赋值。可以认为委托是接口的封装,还有一个List列表去维护需要执行的函数,也就是用类似于观察者模式进行的封装。

class Action
{
    List<IActionCallback> invocationList = new List<IActionCallback>();

    public void AddListener(IActionCallback callback)
    {
        invocationList.Add(callback);
    }

    public void RemoveListener(IActionCallback callback)
    {
        invocationList.Remove(callback);
    }

    public void SetListener(IActionCallback callback)
    {
        invocationList.Clear();
        invocationList.Add(callback);
    }

    public void Invoke()
    {
        for(int i = 0;i < invocationList.Count;i++)
        {
            invocationList[i].Callback();
        }
<think>好的,我现在需要回答用户关于Unity接口字段定义与赋值规则的问题。首先,我得回顾一下C#的接口基本知识,因为Unity使用的是C#语言。 根据C#的规定,接口默认只能包含方法、属性、事件和索引器的声明,不能包含字段。这一点我记得没错,因为接口是定义行为契约,而不是具体实现。所以在普通情况下,接口里是不能直接定义字段的。用户可能在这里有疑问,比如为什么不能,或者有没有办法绕过这个限制。 不过,用户提到的是Unity中的接口,是否有特殊处理呢?Unity虽然基于C#,但并没有扩展接口的功能,所以规则应该和C#一致。也就是说,在Unity接口中,同样不能直接定义字段。但是用户可能看到某些类似字段的写法,需要进一步分析。 接下来,用户可能想问如何在接口中实现类似字段的功能。这时候,属性(Property)就派上用场了。接口中可以定义属性,而属性可以有get和set访问器。例如,在接口里写int Value { get; set; },这样实现该接口的类就需要提供这个属性的具体实现,可以是自动属性或者带有私有字段支持的属性。这样虽然看起来像字段,但本质上是属性。 另外,C# 8.0引入了默认接口实现,允许在接口中提供方法的默认实现,但这仍然不适用于字段。属性可以有默认实现,但字段不行。所以即使在C# 8.0之后,接口里还是不能有字段,但属性可以有默认实现,这可能是一个需要注意的地方。 用户还可能混淆了接口和抽象类。抽象类可以包含字段,但接口不行。需要明确两者的区别。如果在Unity中需要字段的存在,可能需要考虑使用抽象类而不是接口,但接口更适合定义行为契约。 关于赋值规则,因为接口本身不能包含字段,所以直接赋值是不可能的。但通过属性,可以在实现类中对属性进行赋值。例如,在类中实现接口属性时,可以有一个私有字段来存储值,并通过属性访问器来读写该字段。 总结一下,Unity中的接口不允许直接定义字段,但可以通过属性来模拟字段的行为。同时需要注意C#版本的影响,以及接口与抽象类的区别。用户可能需要了解如何正确使用属性来代替字段,以及如何在实际开发中应用这些规则。 现在需要生成相关问题,可能包括接口与抽象类的区别、属性与字段的区别、如何在接口使用属性、C#版本对接口的影响等。这些相关问题可以帮助用户更全面地理解该主题。</think>### Unity接口中字段定义与赋值规则 在Unity使用C#语言时,接口(`interface`)的字段定义与赋值需遵循以下规则: 1. **接口中不允许直接定义字段** C#的接口仅用于定义行为契约,不能包含字段(即变量)。例如,以下代码会报错: ```csharp public interface IExample { int myField; // 错误:接口不能包含字段 } ``` 2. **通过属性模拟字段功能** 接口中可使用属性(`Property`)实现类似字段的功能。属性本质是方法的封装,支持`get`和`set`访问器: ```csharp public interface IExample { int Value { get; set; } // 正确:接口属性声明 } ``` 实现类需通过自动属性或私有字段支持属性: ```csharp public class ExampleClass : IExample { private int _value; public int Value { get => _value; set => _value = value; } } ``` 3. **默认接口实现的限制** 从C# 8.0开始,接口支持默认方法实现,但仍**不支持字段定义**。属性可提供默认实现,但需注意兼容性问题: ```csharp public interface IExample { int Value { get; set; } => 0; // 允许默认实现(需C# 8.0+) } ``` 4. **接口与抽象类的区别** 若需要定义字段,应使用抽象类而非接口: ```csharp public abstract class ExampleBase { protected int myField; // 正确:抽象类允许字段 } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值