C++: Полиморфный шаблон класса

Обычно Вы будете создавать сервлет на вариант использования. Сервлеты действуют как контроллеры Вашего приложения. Когда Вы определяете, что взаимодействие от пользователя тогда реализует сервлет для управления тем взаимодействием.

таким образом, если Вы используете плоскость servlet/JSP для создания сайта. Если Вы используете платформу, любят распорки, Вы найдете, что они реализуют шаблон фронтального контроллера и используют единственный сервлет, который получает все запросы и передает эти запросы к классам действия, которые реализуют фактическую логику пользовательского запроса. это намного более твердо сделать себя, но это - хорошая практика... причина, почему столько людей использует эти платформы.

, Таким образом, короткий ответ, Вы создадите много сервлетов на веб-приложение, так как каждое веб-приложение представит несколько вариантов использования.

[РЕДАКТИРОВАНИЕ], Перечитывающее Ваш вопрос, кажется, как будто Вы используете термин сайт для значения страницы или представления. Снова, это зависит от того, что происходит на том представлении. Например, Для отображения новейшей записи в блоге у Вас может быть сервлет, который создает список из записей от базы данных для дисплея. Если пользователь нажимает на запись тогда, другой сервлет может получить тот однократный въезд для просмотра и так далее. Главным образом каждое действие является вариантом использования поэтому различный сервлет.

5
задан mahju 12 October 2009 в 08:04
поделиться

6 ответов

Я знаю, как это сделать, это Java, но я все еще не знаком с синтаксисом C ++. Проблема очень похожа на то, как некоторые коллекции могут принимать только переменные шаблона, которые реализуют Comparable. Заголовок будет выглядеть примерно так:

public class Calendar<D extends Date>{
     ...
}

Правда, это та же проблема, и в C ++ она обычно решается игнорированием. Почему нам нужно обеспечить, чтобы объект реализовал IComparable ? В Java это необходимо из-за анемичной системы типов. Без этого ограничения мы не смогли бы сравнивать объекты.

В C ++ правила другие. Контейнеры просто пытаются сравнить объекты, которые они хранят, и если тип не поддерживает это, вы получите ошибку компиляции. Никаких интерфейсов или наследования не требуется.

А вы » d обычно делает то же самое в классе Calendar . Просто не применяйте ограничение «должен быть подклассом формы Date .

Вместо этого укажите элементы, которые должен предоставлять тип, и какую семантику следует от них ожидать. .

Например, если ваш Календарь пытается выполнить следующие операции для объектов даты d0 и d1 :

d0.getDay();
d0.getTime();
Time t = d0 - d1;

, то это операции, которые должны поддерживаться. класс, который поддерживает эти операции , является допустимым классом Date, даже если он не является подклассом ничего .

от них следует ожидать семантики.

Например, если ваш Календарь пытается выполнить следующие операции для объектов даты d0 и d1 :

d0.getDay();
d0.getTime();
Time t = d0 - d1;

Тогда это операции это следует поддерживать. Любой класс, поддерживающий эти операции , является допустимым классом Date, даже если он не является подклассом ничего .

от них следует ожидать семантики.

Например, если ваш Календарь пытается выполнить следующие операции для объектов даты d0 и d1 :

d0.getDay();
d0.getTime();
Time t = d0 - d1;

Тогда это операции это следует поддерживать. Любой класс, поддерживающий эти операции , является допустимым классом Date, даже если он не является подклассом ничего .

9
ответ дан 18 December 2019 в 06:51
поделиться

То, что вы ищете, - это проверка концепции для аргументов шаблона. Они были частью черновика следующего стандарта C ++, но были снова выброшены несколько недель / месяцев назад.

Без концепций в собственном языке есть несколько библиотек, которые пытаются это сделать, но причина того, что проверки концепций являются частью основного языка, заключается в том, что их более или менее невозможно реализовать без поддержки языка.

В вашем конкретном примере это не должно быть слишком сложно. Например, вы можете поместить специальный typedef в базовый класс и проверить это:

class date {
  public:
    typedef int is_derived_from_date;
};

template<typename D> class Calendar{ 
    typedef typename D::is_derived_from_date blah;
    ...
};

Другой способ - выбрать любой из is_dehibited :: мета-функции шаблона result , плавающие в сети, и реализовать статическую проверку этого в вашем классе Calender . Boost имеет как метафункцию is_dehibited , так и статическое утверждение.

Однако, сказав все это, я должен поставить под сомнение ваш замысел. Что не так с обычным объектно-ориентированным полиморфизмом, если вы хотите использовать полиморфизм времени компиляции шаблонов?

8
ответ дан 18 December 2019 в 06:51
поделиться

Думаю, ваша проблема решима без использования шаблонов. D всегда является производным классом Date, тогда почему бы просто не иметь коллекцию объектов Date?

3
ответ дан 18 December 2019 в 06:51
поделиться

На языке C ++ это называется проверкой концепции. В C ++ обычно утверждается, что наследование используется для наследования интерфейсов, а не реализации. Так что на самом деле вас не так сильно интересует, наследуется ли D от Date , но есть ли у D элементы интерфейса Date , которые вам нужно, а именно он имеет необходимые функции-члены и т. д. Преимущество этого состоит в том, что вам не нужно иметь будущие классы D , которые должны наследовать от Date , им просто нужно для реализации определенных функций.

Проверка концепций была удалена в C ++ 0x, но вы можете найти ее в Boost.ConceptCheck (основной сайт Boost - здесь ).

2
ответ дан 18 December 2019 в 06:51
поделиться

Если вы хотите взаимодействовать только с объектами Date, почему бы просто не использовать простой полиморфизм и просто иметь дело с Date * -s?

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

Что касается шаблонов, если данный тип имеет подходящий интерфейс, почему не следует это не работает с календарем? (Что ж, концепции были запланированы для C ++ 0x, но отказались от них, но их основная мотивация, казалось, заключалась в том, чтобы позволить более четкие сообщения об ошибках, связанных с шаблоном.)

0
ответ дан 18 December 2019 в 06:51
поделиться

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

template <typename T>
T clone(const T& cloneable) {
    return cloneable.create_clone();
} 

Этот код будет работать для любого типа, который поддерживает операцию create_clone () , нет Используется интерфейс ICloneable !

В вашем случае этот код позволит использовать любой тип, который ведет себя как дата.

Если вы хотите полиморфизм базового класса, просто не указывайте шаблоны и используйте Date * .

Обратите внимание, что если вы действительно хотите провести тест шаблона, вы можете попытаться привести указатель фиктивного объекта к Date * , который завершится ошибкой во время компиляции если он не является производным от Date . Но обычно код шаблона используется не так.

1
ответ дан 18 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: