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
может преобразовать себя из одного вида в другой.
Что именно вы пытаетесь сделать, и почему это еще не сделано в сторонней библиотеке?