3

我在很多地方看到过以下模式:

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>实现了接口IProvider,它解释了子调用的需要并回答了我的问题。

4

5 回答 5

2

所以唯一的区别是返回类型(Object而不是T),这意味着调用者需要强制转换。

我能想到这样做的唯一原因是他们是否实现了一个接口object Create(IContext context);

于 2011-06-03T10:18:57.850 回答
2

它通过确保它创建一个类型为 T 的对象为提供者提供编译时类型安全,但允许该类与仅适用于对象的更通用代码接口。

这在处理与控制容器反转一起使用的工厂对象时很常见。

于 2011-06-03T10:22:33.893 回答
1

我看到的唯一用法是 SimpleProvider 使用方法实现接口时Create(IContext context)。然后,您可以从不需要知道 T 的确切类型的类中使用它,这在某些情况下可能非常重要。

于 2011-06-03T10:20:38.767 回答
0

如果您所说的一切都是真的,那么没有实际区别,您只是获得免费的类型安全方法=)

于 2011-06-03T10:13:53.933 回答
0

它节省了调用者在编译期间必须知道 T 的时间。它还使接口在整个类层次结构中保持一致,因为公共方法与任何特定的子类实现分离。

于 2011-06-03T11:02:00.750 回答