Что это? Шаблонный метод или как? - PullRequest
0 голосов
/ 19 марта 2009

У меня есть класс Request.cs

Имеет абстрактный метод:

public abstract Response CreateResponse(XmlReader reader);

и есть также метод:

public Response SendRequest(string requestURI)
{
    ...

    XmlReader reader = XmlReader.Create(responseStream);

    return CreateResponse(reader);
}

CreateResponse method реализован в подклассе, который расширяет Request. И эта реализация возвращает ответ.

Я не понимаю, как вы можете вернуть метод, подобный этому, это абстрактный метод, но возвращаемое значение фактически находится в реализации метода из подкласса. Это пример шаблона Template Method или просто простой полиморфизм, или это «хитрый или слишком хитрый» код или даже грязный? Я пытаюсь выяснить, как это можно сделать (это основной принцип ООП или шаблон проектирования), и это хорошая практика или хорошее использование ООП?

Ответы [ 4 ]

1 голос
/ 19 марта 2009

Да, это метод шаблона. Поскольку класс Response является абстрактным, вы вынуждены реализовать CreateResponse, прежде чем сможете вызвать SendRequest. Таким образом, общая логика инкапсулируется в базовый класс, а остальная логика может изменяться по мере необходимости (путем создания нескольких реализаций базового класса).

1 голос
/ 19 марта 2009

Это очень стандартный подход. На самом деле это часто рекомендуется. CreateResponse метод похож на пробел, который должен быть заполнен производным классом

0 голосов
/ 19 марта 2009

Это шаблонный метод, а шаблонный метод на самом деле не намного больше, чем простой полиморфизм. Это именно тот тип вещей, для которого предназначен типичный полиморфизм ОО в стиле C # / Java и который хорошо использует язык.

0 голосов
/ 19 марта 2009

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

Поскольку метод является абстрактным, он не имеет подробностей, поскольку он должен быть определен производным классом. Основной момент, который делает это возможным, состоит в том, что «IN» и «OUT» никогда не меняются, поскольку метод является абстрактным в основе, поэтому определяется интерфейс, но не реализация ... пока.

Думайте об этом, как о ком-то, кто продает базовые авиабилеты из пункта А в пункт Б, не зная, какую авиакомпанию планируется использовать. Они еще не знают, как вы туда доберетесь, но как только они передадут контракт с проданным билетом авиакомпании, эта авиакомпания выяснит детали выполнения условий контракта. Все, что вас волновало при покупке билета, это то, что вы знали, что за x долларов вы собираетесь добраться от А до Б.

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