最近我尝试使用泛型实现编译时调度(下面的例子)
public interface IAbstraction
{
public void Initialize();
}
public sealed class Implementation : IAbstraction
{
public void Initialize()
{
}
}
public sealed class GenericUsage<T> where T : class, IAbstraction
{
private readonly T _abstraction;
public GenericUsage(T abstraction)
{
_abstraction = abstraction;
}
public void CallAction()
{
_abstraction.Initialize();
}
}
public static void Main()
{
var genericUsage = new GenericUsage<Implementation>(new Implementation());
genericUsage.CallAction();
}
如您所见,我还明确使用了sealed
关键字作为信号,表示传递给构造函数的类型不可能与泛型中使用的类型不同。
在 JIT Asm 方面,我没有看到任何去虚拟化。调用仍然通过 vtable 进行。
有没有可能通过泛型实现编译时调度?也许我漏掉了什么。如果没有,为什么上面的示例不起作用?