gpt4 book ai didi

c# - 实现一个非常特殊的通用签名

转载 作者:行者123 更新时间:2023-12-02 21:50:07 26 4
gpt4 key购买 nike

我目前正在基于 Unity 的装饰器模型构建自己的游戏引擎。我有三个类(SceneStateManager(一次仅控制一个场景)> Scene > SceneLayer > GameObject > Component),它们构成了场景层次结构,除了名称和一些较小的、非常具体的功能之外,它们基本上都是相同的。 (在这种情况下重写方法会做到这一点)

所有类都可以从父层次结构级别类类型进行初始化,并控制多个子类。由于这些类共享许多通用功能,因此我想让它们从基类派生,该基类对共享功能进行分组以简化代码。

“ super 基类”(ListJob<T>)是一个控制子类的类,到目前为止,所有前面提到的类型都派生自它,以至少简化该部分。因此,子处理本身不需要包含在此处的代码中,因为它已经运行得很好。

我现在需要为所有场景层次结构类将来派生的基类获取正确的通用签名。我当前的解决方案无法编译并出现以下错误:http://msdn.microsoft.com/en-us/library/bb384252(v=vs.100).aspx


我当前版本的通用签名和 SceneSystemJob 类:

public abstract class SceneSystemJob<TItem, TParent> : ListJob<TItem>, IInitializable<TParent>  
where TItem : IInitializable<SceneSystemJob<TItem, TParent>>
{
private TParent _Parent = default(TParent);

public TParent Parent
{
get
{
return _Parent;
}
protected set
{
_Parent = value;
}
}

// Implementation

public void Initialize(TParent parent)
{
this.Parent = parent;
}
}

场景状态管理器:

public class SceneStateManager // Controls only one Child and does not derive from super base class

场景:

public class Scene : SceneSystemJob<SceneLayer, SceneStateManager>

场景层:

public class SceneLayer : SceneSystemJob<GameObject, Scene>

游戏对象:

public class GameObject: SceneSystemJob<Component, SceneLayer>

组件:

public abstract class Component : Manager, IInitializable<GameObject>

接口(interface)II可初始化:

public interface IInitializable<TParent>
{
void Initialize(TParent parent);
}

如果您还需要更多代码,请告诉我。

最佳答案

除了从一个更简单的系统开始之外,我不知道如何解决您的问题。这看起来设计得太过分了。

要解释为什么你的代码是错误的,请查看它的这个大大简化的版本:

public interface IInitializable<TParent> { }
public class SceneSystemJob<TItem>
where TItem : IInitializable<SceneSystemJob<TItem>>
{ }
public class GameObject : SceneSystemJob<Component> { } // Error here
public class Component : IInitializable<GameObject> { }

错误是Component不能用作TItem 。为什么不?这似乎是可行的:

  • TItem要求它实现 IInitializable<SceneSystemJob<TItem>>
  • Component实现IInitializable<GameObject>
  • GameObject是一种特殊的SceneSystemJob<Component>>
  • 因此Component符合实现IInitializable<SceneSystemJob<Component>>的标准

不幸的是,结论不能从前提得出,除非 IInitializable<T> T 中协变。由于您的实际实现有一个接受 T 的方法,因此它不能在 T 中协变。

这样想吧。安IInitializable<T>就像一个容器,你可以放 T进入。该约束表示“您需要给我一个 TItem,这样我就可以将任何 SceneSystemJob<TItem> 放入其中。”您给它一个容器,您只能放置 GameObject进入。因此不满足约束。

这就像约束说“我需要一个可以容纳任何动物的笼子”,而你却给了它一个水族馆。嗯,这是一个可以容纳任何鱼的笼子,但约束并没有说“我需要一个笼子来容纳一些动物,你的选择”,它说它需要一个适用于任何动物的笼子。

除了重新开始并且不那么过于通用之外,我不知道你如何解决你自己陷入的困惑。

关于c# - 实现一个非常特殊的通用签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com