c ++ Григорианский и юлианский календарь наследования - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть эта дилемма, где мне нужно выбирать между различными типами наследования для григорианского и юлианского каландров. Я хочу иметь один класс с именем Дата в качестве базового класса. Мой вопрос заключается в следующем: Должен ли я иметь класс для григорианского, который наследует от класса даты и Джулиана, который делает то же самое? Или только григорианский класс наследует от даты, а юлианский наследует от григорианского, или наоборот? Или у меня должен быть класс ниже Date, который наследуется от Date, а григорианский и юлианский наследуют от этого класса?

        Date               Date              Date                     Date

 Gregorian  Julian        Gregorian         Julian                New class

                            Julian         Gregorian          Gregorian   Julian

Я бы лично выбрал первый вариант, где оба наследуют от Date, это хороший выбор. Могу ли я получить сомные мнения по этому поводу?

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

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

Я бы пошел с

  • отдельные классы (типы)
  • необязательные неявные преобразования
  • общие утилиты из класса политики / стратегии, чтобы избежать нежелательного дублирования кода

PS. В классическом смысле «Лискова» у вас может быть абстрактный базовый класс Date, который просто «называет» понятия, общие для всех (большинства?) Календарных систем. Тем не менее, я действительно сомневаюсь, что будет добавленной стоимостью. Я мог видеть, что это приводит к большой путанице (он предлагает коду смешивать подтипы Date в любом или во всем коде, и весь код, использующий ваши классы datetime, должен быть всегда подготовлен для обработки всей гаммы).

Кстати, взгляните на Время Ноды и Время Йоды . Считается, что эти уважаемые библиотеки особенно хорошо разработаны.

2 голосов
/ 29 сентября 2011

Григорианский и юлианский календари - это два типа календаря. Для них было бы лучше наследовать от общего базового класса, чем наследовать друг от друга.

Пример можно найти во времени Йода, в котором григорианская и юлианская хронологии являются отличными подклассами от общей базовой хронологии.

Контрпример можно найти в стандартной библиотеке Java, в которой григорианский и юлианский календари поддерживаются одним и тем же классом.

1 голос
/ 29 сентября 2011

A Calendar не является Date, поэтому нет необходимости ни наследовать от Date.

Самое большее, Calendar должно работать на Dates. Или, возможно, Date может преобразовать себя из одного вида в другой.

Что именно вы пытаетесь сделать и почему это еще не сделано в сторонней библиотеке?

...