Я знаю об основанных на классах и основанных на протипе объектно-ориентированных языках программирования, есть ли какие-либо другие альтернативы? Каковы они?
Это действительно два основных подхода, лежащих в основе объектно-ориентированных языков, и я не знаю еще одного совершенно другого базового принципа.
Но существует множество вариантов обоих подходов, а также множество других конструкций языка программирования , которые решают проблему повторного использования / расширения либо на основе классов, либо на основе прототипов. язык. Примеры: черты, примеси, методы расширения, частичный класс, дженерики, слоты первого класса, разделенные объекты и т. Д. Многие такие конструкции впервые предлагаются в исследовательских статьях (конференции ECOOP, OOPSLA, POPL), а некоторые из них становятся мейнстрим на популярных языках. Но я бы назвал их вариациями , а не новаторским основополагающим принципом.
Обратите внимание, что вы можете имитировать объектно-ориентированное программирование на языках, которые не являются объектно-ориентированными сами по себе . Например, в Clojure multi-method . Объектно-ориентированное и функциональное программирование также постепенно объединяется, например, в Scala.
РЕДАКТИРОВАТЬ
На самом деле сложно составить список классических / основополагающих статей, и я не претендую на то, чтобы иметь для этого достаточно знаний. Если он где-то есть, мне было бы очень интересно его посмотреть :) Тем не менее, вот несколько, которые могут вас заинтересовать.
Наследование, делегирование, подтипирование:
Модуль, композиция, адаптация
Вы можете проверить статью в Википедии о парадигмах программирования. Я работал с аспектно-ориентированным программированием, и здесь на помощь приходят миксины.
миксины позволяют расширять класс с помощью кода, который определен в другом месте, например, в модуле.
См. Введение в Ruby Mixin Tutorial .
В Go есть концепция, похожая на классы, но без наследования и с очень гибкими интерфейсами. Подробнее об этом можно прочитать в Эффективный Go.