Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用实现的接口方法,但区分它们对某些对象的调用_C#_Unity3d_Design Patterns - Fatal编程技术网

C# 调用实现的接口方法,但区分它们对某些对象的调用

C# 调用实现的接口方法,但区分它们对某些对象的调用,c#,unity3d,design-patterns,C#,Unity3d,Design Patterns,我面临着一个设计问题,我试图调用实现某个接口IIInitialize的所有对象,该接口有一个“Initialize”方法 “IInitialize”可以实现几个类,如GameManager、Player、敌军等 但是IInitialize也可以在其他类中实现,这些类不必在我想重新启动游戏的时候进行初始化,所以我需要对Init调用进行某种“分类”,这样其他类就不会在我不需要的时候被调用 所以在这里,我有一些选择,比如创建另一个空的“IInitialize”子类,然后通过这个类型调用“Initial

我面临着一个设计问题,我试图调用实现某个接口IIInitialize的所有对象,该接口有一个“Initialize”方法

“IInitialize”可以实现几个类,如GameManager、Player、敌军等

但是IInitialize也可以在其他类中实现,这些类不必在我想重新启动游戏的时候进行初始化,所以我需要对Init调用进行某种“分类”,这样其他类就不会在我不需要的时候被调用

所以在这里,我有一些选择,比如创建另一个空的“IInitialize”子类,然后通过这个类型调用“Initialize”。所有实现子类的类都将得到这个调用。(这是可行的,但这是一种正确的方法,而不是代码气味?)

另一个选项是创建一个通用的“Initialize”接口,只需传递字符串或类似的内容来区分调用

概括一下:我实现了各种类的接口,比如说“ILife”,它有一个方法“Die”要在类中实现。但是,我不希望所有类型的对象都在某个特定的时间死亡,只希望是必需的对象。

还有其他想法吗?还是我走错了方向


提前谢谢

由于这个问题被标记为C,我将在代码示例中使用C。但解决方案也适用于任何面向对象语言

这是一个设计问题。你有很多选择来解决这个问题。我将展示三个:

1。使用服务于特定场景的单独接口

interface IInitializable
{
  void Initialize();
}

interface IGameStartInitializable : IInitialize
{
}
public List<IInitialize> DefaultInitializables = new List<IInitialize>();

public List<IInitialize> GameStartupInitializables = new List<IInitialize>();
如果两个接口共享完全相同的成员,则此解决方案或特别是
IGameStartInitializable
接口将具有标记接口的特征,并证明设计不好

我不推荐这种解决方案

2。为对象使用单独的容器

interface IInitializable
{
  void Initialize();
}

interface IGameStartInitializable : IInitialize
{
}
public List<IInitialize> DefaultInitializables = new List<IInitialize>();

public List<IInitialize> GameStartupInitializables = new List<IInitialize>();

这是最优雅的方式。它是可扩展的,因为每个实现都处理自己的初始化。无需过滤或排序(将实现添加到正确的集合中)和迭代。

您可以使用传递到
Initialize
方法中的一些事件信息,让类自己决定是否对某些事件类型(新游戏、重新启动)进行初始化或者,您可以创建一些额外的标记接口,然后查找实现say
IRestartable
的类,如果您希望有一个具有两个方法的接口,但在某些类中只有一个方法,您可能需要两个接口,一个从另一个派生并添加第二个方法I指的是像“IInitializable”这样的接口以及其他空接口(继承自此接口),如“IIInitializableMenu”、“IIInitializableGame”等。通过这种方式,很容易判断哪些对象得到“Initialization”调用,因为您在类中实现了不同的接口。如果您的问题是,“我想做[事情],但不完全是[事情]”,那么您的体系结构是错误的。如果您有一个提供
初始化
方法的接口,但不想全部调用,则需要两个接口:一个用于ALL调用,另一个用于其他目的。