你可能会看到:
一个类型只能参与一个继承层次
现在,对吗?
当您回想ResourceNode<T> 不是封闭类型时,问题就变得更清楚了——但ResourceNode<Ship> 和ResourceNode<SomeType> 是。这意味着两件事:
首先,Node 需要分别了解这两者(ResourceNode<Ship> 和ResourceNode<SomeType>),其次:我们需要告诉ResourceNode<Ship> ShipResource only,以及@ 987654329@ 关于SomeResource 仅限。
第一个很容易使用属性方法:
[ProtoContract]
[ProtoInclude(1, typeof(SomeNodeType)), ProtoInclude(2, typeof(SomeOtherType))]
[ProtoInclude(3, typeof(ResourceNode<Ship>))]
[ProtoInclude(4, typeof(ResourceNode<SomeType>))]
public class Node { }
但是,第二个位不能在任何当前版本中清晰地表达。我们目前无法使用:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
因为这些属性适用于ResourceNode<Ship> 和ResourceNode<SomeType>,并且代表非法继承链。上面重复的1 是故意的,因为它们不冲突,同样因为它们是并行分支。
在 v2 中,我们可以做的是明确配置这种关系:
RuntimeTypeModel.Default.Add(typeof(ResourceNode<Ship>), true)
.AddSubType(1, typeof (ShipResource));
RuntimeTypeModel.Default.Add(typeof(ResourceNode<SomeType>), true)
.AddSubType(1, typeof(SomeResource));
我想要做的是调整解析器,使其能够将其检测为常见情况,以便您可以简单地使用属性:
[ProtoContract]
[ProtoInclude(1, typeof(ShipResource)), ProtoInclude(1, typeof(SomeResource))]
public class ResourceNode<T> : Node { }
我添加了一个“待办事项”项目,但未通过测试。然而,有趣的是,在设置它时,我还发现了一个播放不愉快的场景,所以我需要先解决这个问题