我觉得我不是从正确的角度看待这个问题,而我只是没有考虑其他解决方案.
假设这个泛型类;
public abstract class Port<T>
{
public delegate T PullDelegate();
private PullDelegate pull;
public Port(PullDelegate pull)
{
this.pull = pull;
}
public T Pull()
{
return pull();
}
}
Run Code Online (Sandbox Code Playgroud)
它用于在图形节点编辑器中定义"端口".端口可以将对象/值从一个节点传输到另一个节点,但它们也需要"类型安全",这意味着我无法将任何端口插入另一个错误类型(至少没有一些转换).
节点"拥有"一个端口并为其一个方法赋予它一个委托,因此当另一个节点"拉"一个值时,该端口只是调用它并返回正确的值.
当我尝试Pull()
从非泛型集合调用时,我的问题就出现了.显然,我可以创建一个非泛型的基本方法,但是然后Pull无法返回T
,它需要返回object
.
此外,每个节点都有其端口的集合访问器,因此其他项目可以获取它们.该收集必须是非泛型的,因为一个节点可以有许多类型的许多端口.
public abstract Port[] Inputs { get; }
public abstract Port[] Outputs { get; }
public abstract Port[] Entries { get; }
public abstract Port[] Exits { get; }
Run Code Online (Sandbox Code Playgroud)
非泛型类型发挥作用的那一刻,通用的一切都变得无法访问.如果只是Port<>[]
一件事.
我觉得我错过了什么......
使用显式实现来Port<T>
实现非通用接口IPort
。通过这种方式,它对 API 是隐藏的,但仍然允许您调用通用类中的方法。
public interface IPort
{
object SomeAction(object data);
}
public class Port<T> : IPort
{
//[.. all other methods ..]
object IPort.SomeAction(object data)
{
var typedData = (T)data;
//invoke our typed version.
return SomeAction(data);
}
public T SomeAction(T data)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
217 次 |
最近记录: |