【问题标题】:Please explain this pattern when using abstract method请在使用抽象方法时解释此模式
【发布时间】:2011-06-03 10:06:18
【问题描述】:

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

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);
}

更新:上面的 sn-p 它取自 Ninject 的文档,其中没有指定接口,但查看实际源代码我可以看到 SimpleProvider&lt;T&gt; 实现了接口 IProvider这解释了子呼叫的必要性并回答了我的问题。

【问题讨论】:

  • 有没有public方法的用法?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-21
            • 1970-01-01
            相关资源
            最近更新 更多