将接口实现作为组件添加到游戏对象

Posted

技术标签:

【中文标题】将接口实现作为组件添加到游戏对象【英文标题】:Add interface implementation as a component to a gameobject 【发布时间】:2021-06-13 22:50:14 【问题描述】:

使用依赖注入,您可以拥有一个表示不同类的相同接口,因为类实现可以按照绑定阶段的绑定阶段定义的方式绑定到依赖容器。我的问题是,一旦完成各自的绑定,如果实现是单一行为,是否有机会将接口作为组件添加到游戏对象。

我为什么要这样做的故事很长,所以可以假设刚出现的必要性:)。

找到一些伪代码以便更好地理解:

public interface IFoo 
    //...


public class FooIplementtation1: MonoBehaviour 
    //....


public class FooIplementtation2: MonoBehaviour 
    //....


if (someCondition) 
    Container.Bind<IFoo >().To<FooIplementtation1>();
 else 
    Container.Bind<IFoo >().To<FooIplementtation2>()

我打算做的是:

//Error. Interface type cannot be added as component.
someTransform.gameObject.AddComponent<IFoo>();

但我得到了错误:

IFoo 类型不能用作泛型或方法 GameObject.AddComponent() 中的类型参数“T”。

方法签名是:

public T AddComponent<T>() where T : Component;

Si 我试图让我的接口继承自Monobehaviour 并形成Component,但没有奏效。

知道这是否可行,如果可行,怎么做?

【问题讨论】:

【参考方案1】:

GameObject.AddComponent 文档状态

向游戏对象添加一个名为 className 的组件类。

组件类型应该是类,不能是结构,也不能是接口。 接口只是一个约定,类必须实现给定的接口函数和属性。您隐藏了为什么要为代码使用接口,但如果可以创建一个基类,其中包含所有类共享的所有内容。总之使用Polymorphism。从 monobehaviour 继承基类,你就可以做你想做的事了。

还认为接口根本没有数据。它们只是空的实现,它的哪一部分可以成为对象的组件?他们只是让编码更容易而已。也许,你想看看C# Design Patterns。

【讨论】:

以上是关于将接口实现作为组件添加到游戏对象的主要内容,如果未能解决你的问题,请参考以下文章

java基础——实现Callable接口创建线程

设计模式 - 装饰者模式

JSF 2 - 如何将 Ajax 侦听器方法添加到复合组件接口?

戏说模式之装饰者模式(游戏)

装饰者模式

创建多线程方式二(实现Runnable接口)