C++ Грегорианское и юлианское наследование календаря

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

        Date               Date              Date                     Date

 Gregorian  Julian        Gregorian         Julian                New class

                            Julian         Gregorian          Gregorian   Julian

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

3 ответа

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

Я бы пошел с

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

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

Кстати, взгляните на Noda Time и Joda Time. Считается, что эти уважаемые библиотеки особенно хорошо спроектированы.

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

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

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

Calendar это не Date так что нет необходимости ни наследовать от Date,

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

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

Другие вопросы по тегам