Рассмотрите класс Календарь, в котором хранится куча объектов Date. Календарь предназначен для хранения коллекции объектов любого типа, которые наследуются от Date. Я думал, что лучший способ сделать это, чтобы иметь шаблон класса, такой какC++: шаблон полиморфного класса
template<typename D> class Calendar{
...
}
Но меня поразил, что D теперь может фактически быть любым классом. Вопрос теперь, как я могу убедиться, что D является подклассом объекта даты?
Я знаю, как это сделать, это Java, но я все еще не знаком с синтаксисом C++. Проблема очень похожа на то, как некоторые коллекции могут принимать только переменные шаблона, которые реализуют Comparable. Затем заголовок будет выглядеть примерно как
public class Calendar<D extends Date>{
...
}
-------------------- EDIT: -------------- ----------------------------
Аргумент шаблона определяет, к какому действительному дню относится календарь. Различные типы дат относятся к одному и тому же дню в разных форматах. Например, если я сделаю 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
------------- правка: ----------- -----------
Последнее изменение теперь имеет больше смысла. У меня было небольшое несогласие с форматированием.
Спасибо за все ответы.
Я студент-информатик на третьем курсе, и я бы сказал, что я довольно хорошо знаком с ОО и связанными с ним концепциями, такими как Полиморфизм и т. Д. Целью этого поста было выяснить, есть ли в C++, чтобы выразить условие для аргумента шаблона так же, как и на Java, и решить проблему кратким, изящным и интуитивно понятным способом.
Почему это необходимо * для подкласса даты? До тех пор, пока он ведет себя как дата (раскрывает правильные члены), что не так, если рассматривать его как дату? – jalf