我觉得我没有从正确的角度看待这个问题,而且我没有想到其他的解决方案。
假设有这个通用类;
public abstract class Port<T>
{
public delegate T PullDelegate();
private PullDelegate pull;
public Port(PullDelegate pull)
{
this.pull = pull;
}
public T Pull()
{
return pull();
}
}
它用于定义图形节点编辑器中的“端口”。端口可以将对象/值从一个节点传输到另一个节点,但它们也需要是“类型安全”的,这意味着我不能将任何类型错误的端口插入到另一个端口中(至少不会没有一些转换)。
节点“拥有”一个端口并向其方法提供委托,因此当另一个节点“拉”取值时,端口仅调用它并返回适当的值。
当我尝试从非泛型集合中调用Pull()
时,我的问题开始了。显然,我可以创建一个非泛型基本方法,但是然后Pull
可能无法返回T
,而需要返回object
。
此外,每个节点都有其端口的集合访问器,因此其他项可以获取它们。该集合必须是非泛型的,因为一个节点可以有多个不同类型的端口。
public abstract Port[] Inputs { get; }
public abstract Port[] Outputs { get; }
public abstract Port[] Entries { get; }
public abstract Port[] Exits { get; }
一旦非泛型类型开始发挥作用,所有泛型都将变得无法访问。如果只有
Port<>[]
存在就好了。我感觉好像漏掉了什么...
IPort<out T> { T Pull(); }
,然后创建一个IEnumerable<Port<object>>
。 - LeePort<T> : Port
。现在,我正在尝试Lee的建议,使用IPort<object>
。 - LightStrikerT
类型,对吗?如果有人实现一个新的Port<Potato>
而我不知道,那么它就会出问题? - LightStrikerIEnumerable<IPort<object>>
或IReadOnlyCollection<IPort<object>>
。如果您需要使集合可变,则无法使用此方法。 - Lee