[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();
        }
    }
}

把里面的接口换成函数指针的话,应该就是委托了吧(猜的)。

==============================

2.减少代码耦合

假如有三个类Presenter、View、ViewComponent。对于Presenter和View,这两层都是抽象的,是不区分开发引擎的的。ViewCompnent是针对不同的开发引擎的,比如说Unity,一般就是Monobehaviour。如果是Android,一般就是Activity和Fragment。如果没有接口的存在,那代码就会这样写。

class Presenter
{
    View ViewRef;
}

class View
{
    Presenter presenterRef;
    ViewComponent ViewComponentRef
}

class ViewComponent
{
    View ViewRef;
}

如果有接口存在的话,可以直接把View作为一个接口IView,写法就会变成这样。

class Presenter
{
    IView viewRef;
}

class ViewComponent : IView
{
    Presenter presenterRef
}

Presenter也可以作为接口。

class Presenter : IPresenter
{
    IView viewRef;
}

class ViewComponent : IView
{
    IPresenter presenterRef;
}

这个应该就是常说的面向接口编程了吧。

====================

3.为对象添加新功能。
因为接口比较NB的地方是可以多继承,而类只能继承一个。所以一个继承了多个接口的对象,就可以认为有多种能力。比如Unity UGUI里面,可以让对象继承IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler,这样这个对象就拥有可以处理Pointer的进入退出和点击事件的能力。由UGUI源码可知,UGUI把所有对象放在ObjectPool里面,然后用is关键字去判断对象上是否有接口,然后添加到接口的列表中,按顺序执行接口中对应的函数。

比方说有个物品,我们让他不仅可以消耗,还可以装备...虽然吃装备感觉怪怪的

interface IConsumable
{
    void OnConsume();
}

interface IEquipable
{
    void OnEquip();
}

class Item : IConsumable,IEquipable
{
    public void OnConsume()
    {
        
    }

    public void OnEquip()
    {
        
    }
}

这样子这个物品就又能装备也能被消耗。

==============================

以上,欢迎讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值