c ++ Gregoraian和Julian日历继承

时间:2011-09-28 20:01:13

标签: c++ inheritance gregorian-calendar julian

我有这种困境,我需要在Gregorian和Julian calanders中选择不同类型的继承。我希望有一个名为Date的类作为基类。 我的问题如下:我是否应该有一个继承自日期类的Gregorian类和Julian那样的类?或者只有Gregorian类继承自Date和Julian继承自Gregorian,反之亦然?或者我应该在Date之下有一个继承自Date的类,并且从该类继承Gregorian和Julian?

        Date               Date              Date                     Date

 Gregorian  Julian        Gregorian         Julian                New class

                            Julian         Gregorian          Gregorian   Julian

我个人会选择继承Date的第一个选择,这是一个不错的选择。我可以得到关于这个的som意见吗?

3 个答案:

答案 0 :(得分:3)

我不知道日历系统的内部细节,但我确信很难不低估它们的微妙复杂性。仅这一点就会让我绝对想要在类层次结构中混合实现。

我会去

  • 单独的类(类型)
  • 可选的非隐式转化
  • 来自策略/策略类的共享实用程序,以避免不必要的代码重复

PS。在经典的“Liskov”意义上,你可以有一个抽象基类Date,它只是“命名”所有(大多数?)日历系统共有的概念。但是,我真的怀疑增值是多少。我可以看到它导致了很多混乱(它邀请代码在任何或所有代码中混合使用Date的子类型,并且所有使用日期时间类的代码必须准备好始终处理整个色域。)

顺便提一下,请查看 Noda Time Joda Time 。这些备受推崇的图书馆通常被认为设计得特别好。

答案 1 :(得分:2)

Gregorian和Julian日历是两种类型的日历。对于他们来说,从公共基类继承而不是从彼此继承是更好的。

可以在Joda时间找到一个例子,它将格里高利和朱利安年表作为共同基础年表的不同子句。

可以在标准Java库中找到一个反例,其中Gregorian和Julian日历由同一个类支持。

答案 2 :(得分:1)

Calendar不是Date,因此无需继承Date

最多Calendar应在Dates上运行。或许Date可以将自己从一种转换为另一种。

您到底想要做什么,为什么它已经在第三方库中完成?