【发布时间】:2010-12-05 17:48:15
【问题描述】:
考虑一个存储一堆 Date 对象的 Calendar 类。 日历旨在保存从 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
---------- 新编辑:----------
最后的编辑现在更有意义了。我对格式略有不同。
感谢大家的回答。
我是第三年计算机科学专业的学生,我想说我对 OO 和多态等相关概念相当熟悉。这篇文章的目的是找出是否有办法在 C++ 中以与在 Java 中相同的方式表达模板参数的条件,并以简洁、优雅和直观的方式解决问题。
【问题讨论】:
-
为什么它需要成为 Date 的子类?只要它表现得像一个日期(暴露正确的成员),把它当作一个日期有什么问题?
标签: c++ inheritance templates polymorphism