我在很多地方看到过以下模式:
abstract class SimpleProvider<T>
{
public object Create(IContext context)
{
return CreateInstance(context);
}
protected abstract T CreateInstance(IContext context);
}
我不明白实际的区别,为什么它不只是写成:
abstract class SimpleProvider<T>
{
public abstract T Create(IContext context);
}
更新:以上代码段取自Ninject
的文档,其中未指定任何接口,但查看实际来源,我可以看到SimpleProvider<T>
实现了接口{ {1}}解释了对子呼叫的需要并回答了我的问题。
答案 0 :(得分:2)
所以唯一的区别是返回类型(Object而不是T),这意味着调用者需要强制转换。
我能想到这样做的唯一原因是它们是否实现了具有object Create(IContext context);
答案 1 :(得分:2)
它为提供者提供编译时类型安全性,确保它创建一个T类型的对象,但允许该类与只适用于对象的更通用的代码进行交互。
在处理与控制容器反转一起使用的工厂对象时,这很常见。
答案 2 :(得分:1)
我看到的唯一用法是当SimpleProvider实现与方法Create(IContext context)
的接口时。然后你可以从不需要知道T的确切类型的类中使用它,这在某些情况下非常重要。
答案 3 :(得分:0)
如果您说的一切都是真的,那么没有实际的区别,您只是获得了免费的类型安全方法=)
答案 4 :(得分:0)
它保存调用者必须在编译期间知道T。它还使接口在整个类层次结构中保持一致,因为公共方法与任何特定的子类实现分离。