Пожалуйста, объясните эту модель при использовании абстрактного метода - PullRequest
3 голосов
/ 03 июня 2011

Я видел следующий шаблон, используемый во многих местах:

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, который объясняет нужно для дополнительного вызова и отвечает на мой вопрос.

Ответы [ 5 ]

2 голосов
/ 03 июня 2011

Он обеспечивает безопасность типа времени компиляции для провайдера, гарантируя, что он создает объект типа T, но позволяет классу взаимодействовать с более общим кодом, который работает только с объектами.

Это довольно часто встречается при работес заводскими объектами, которые используются с инверсией контрольного контейнера.

2 голосов
/ 03 июня 2011

Таким образом, единственная разница - это тип возвращаемого значения (Object вместо T), который будет означать, что вызывающая сторона требует преобразования.

Единственная причина, по которой я могу это сделать, заключается в том, что они реализовали интерфейс с object Create(IContext context);

1 голос
/ 03 июня 2011

Единственное использование, которое я вижу, это когда SimpleProvider реализует интерфейс с методом Create(IContext context).Затем вы можете использовать его из классов, которым не нужно знать точный тип T, что может быть очень важно в некоторых случаях.

0 голосов
/ 03 июня 2011

Это спасает вызывающего абонента от необходимости знать T во время компиляции. Он также поддерживает согласованность интерфейса во всей иерархии классов, поскольку открытый метод отделен от любых конкретных реализаций подкласса.

0 голосов
/ 03 июня 2011

Нет практической разницы, если все, что вы говорите, верно, вы просто получаете бесплатный метод, безопасный для типов =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...