Это действительно два основных подхода к объектно-ориентированным языкам, и я не знаю другого совершенно другого базового принципа.
Но существует множество вариантов обоих подходов, а также множество других конструкций языка программирования , которые решают вопросы повторного использования / расширяемости на основе классов или прототипов язык. Примеры: черты, миксин, методы расширения, частичный класс, обобщения, слоты первого класса, разделенные объекты и т. Д. Многие из таких конструкций впервые предложены в исследовательских работах (конференции ECOOP, OOPSLA, POPL), и некоторые из них становятся мейнстрим на популярных языках. Но я бы назвал их вариациями , а не новаторским базовым принципом.
Обратите внимание, что вы можете имитировать объектно-ориентированное программирование на языках, которые не являются объектно-ориентированными per se . Например, с Clojure мульти-метод . Объектно-ориентированное и функциональное программирование также постепенно объединяется, например, в Scala.
EDIT
На самом деле трудно составить список классических / оригинальных работ, и я не претендую на то, что у меня достаточно знаний для этого. Если есть где-то один, мне было бы очень интересно увидеть его :) Тем не менее, вот несколько, которые могут вас заинтересовать.
Наследование, делегирование, подтип:
Модуль, композиция, адаптация