Я посмотрел несколько видео и статей о метаклассах, и в IMO они могут заменить наследование и предоставить способ наследования во время компиляции.
С помощью метаклассов я могу предоставить интерфейсы, реализацию функций по умолчанию и даже правильность реализации (не тела функций) класса во время компиляции. Таким образом, есть что-то, что нельзя сделать в метаклассах, что можно сделать с помощью наследования, полиморфизма и ОО?
В качестве общего замечания я пишу как «частый» автор метаклассов Python:
Метаклассы не означало для использования «изо дня в день», и хотя метаклассы C ++ могут не совпадать с тем, что они есть в Python, я вряд ли смогу использовать такую концепцию для замены чего-то такого же общего, как наследование.
Наследование имеет свои роли. Если вам нужны специальные правила для всей иерархии классов, может быть полезно иметь метакласс, чтобы указать эти правила для начала. (Первый пример как в предложении C ++, так и в большинстве пояснительных материалов, которые я просмотрел, — это «интерфейсы», которые подразумевают, что все методы являются виртуальными). Итак, предположим, что вы нашли специальное правило, которое вы хотите, во всем наборе классов в вашей системе и можете выразить это с помощью метакласса, что не мешает вам создавать один базовый класс из этого метакласса, и создавать все другие классы с «нормальное» наследование, если то, что из одного такого класса в другой изменится, является просто обычным переопределением метода и специализацией: наследование все равно будет проще как для кода, так и для любого, кто читает ваш код, как для системы эхо-инструментов цепочки инструментов, которая развивалась вокруг С ++ в десятилетия существования языка.
Так что да, наследование метакласса может, для всего, что разрешать Вы должны закодировать все общие возможности ваших классов в метаклассе, и они просто создают новые классы, используя этот метакласс, а не наследование. Но на Земле нет мотивов сделать это.
Просто чтобы вернуться к Python, где я хорошо знаком с концепцией: язык недавно сделал один шаг в обратном направлении — путем включения двух механизмов в нормальном наследовании в версии 3.6, которые ранее были возможны только через метаклассы, и при этом, дополнительно сокращая случаи использования, когда метаклассы необходимы только из-за дополнительных сложностей, которые они обязательно требуют.
Других решений пока нет …