使用抽象方法时请解释这种模式

时间:2011-06-03 10:06:19

标签: c# oop class-design abstract-class abstract-methods

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

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}}解释了对子呼叫的需要并回答了我的问题。

5 个答案:

答案 0 :(得分:2)

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

我能想到这样做的唯一原因是它们是否实现了具有object Create(IContext context);

的界面

答案 1 :(得分:2)

它为提供者提供编译时类型安全性,确保它创建一个T类型的对象,但允许该类与只适用于对象的更通用的代码进行交互。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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