C ++: Полиморфный шаблон класса
Рассмотрим класс Calendar, в котором хранится множество объектов Date. Календарь предназначен для хранения коллекции объектов любого типа, которые наследуются от Date. Я думал, что лучший способ сделать это, чтобы иметь шаблон класса, такой как
template<typename D> class Calendar{
...
}
Но меня поразило, что теперь D действительно может быть любым классом. Мой вопрос сейчас, как я могу убедиться, что D является подклассом объекта даты?
Я знаю, как это сделать на Java, но я все еще незнаком с синтаксисом C ++. Проблема очень похожа на то, как некоторые коллекции могут принимать только переменные шаблона, которые реализуют Comparable. Заголовок будет выглядеть примерно так
public class Calendar<D extends Date>{
...
}
--------------------РЕДАКТИРОВАТЬ: ---------------------------- --------------
Аргумент шаблона определяет, к какому фактическому дню относится календарь. Различные типы дат относятся к одному и тому же дню в разных форматах. Например, если я сделаюCalendar<Gregorian>
он сможет принимать даты в другомDate
формат, скажем, юлианский календарь или любой другой формат даты и представить их в григорианском формате. Это позволяет для преобразования между календарями в разных форматах даты. Итак, если у меня естьCalendar<Gregorian>
Я могу легко превратить его вCalendar<Julian>
, Тогда возможно следующее:
Calendar<Gregorian> cal;
std::cout << "These events are entered as dates in
the Gregorian calendar" << std::endl;
cal.add_event("Christmas", 12, 25);
cal.add_event("Gregorian new year", 1, 1);
std::cout << cal << std::endl;
std::cout << "----" << std::endl;
std::cout << "And printed out as Julian dates" << std::endl;
Calendar<Julian>(cal);
std::cout << cal<< std::endl;
и выводы:
These events are entered as dates in the Gregorian calendar
2009-12-25 Christmas
2010-01-01 Gregorian new year
----
And printed out as Julian dates
2009-12-13 Christmas
2009-12-19 Gregorian new year
------------- Новое редактирование: ----------------------
Последнее редактирование теперь имеет больше смысла. У меня было небольшое несогласие с форматированием.
Спасибо за ответы на все вопросы.
Я учусь на информатике на третьем курсе, и я бы сказал, что довольно хорошо знаком с ОО и связанными с ним понятиями, такими как полиморфизм и т. Д. Выразите условие для аргумента шаблона так же, как в Java, и решите проблему кратко, элегантно и интуитивно понятно.