Добавляю:
если по-английски читаете, то Н. Вирт "Programming In Oberon", последняя глава "Object-Oriented Programming" - там немного, самая суть ООП, как оно видится в Оберонах. Что изменилось - в Оберон-2 и соотв. в КП введены обычные методы - процедуры, связанные с типами, а Вирт в первом Обероне обходится без них, полями типа : PROCEDURE (), которые инициализируются указателями на процедуры, как обработчики событий у компонентов в Дельфи - у этого подхода и свои плюсы в большей гибкости, и свои минусы в меньшем удобстве использования.
Здесь можете скачать Programming In Oberon:
http://oberoncore.ru/index.php?option=c ... 6&Itemid=8

Суть ООП, в принципе, проста.
Обычно в учебниках выделяются такие его "киты", как:
1) Инкапсуляция
2) Наследование
3) Полиморфизм.
Так вот - инкапсуляция в Оберонах реализуется на уровне модулей, т.е. класс как тип данных и модуль как инкапсулирующий блок строго разделены (как и в Дельфи, кстати).

Наследование, которое у нас называется расширением типа данных, выполняет две роли:
а) прикладную - позволяет описать в программе какие-то классификации из предметной области, напрямую выразить то, что "селедка есть рыба" и не дублировать в описании "селедки" те поля, которые уже есть в "рыбе";
б) техническую - позволяет в те процедуры, которые просят "рыбу" (по ссылке или по указателю), передавать в том числе и "селедку", и "акулу", и что угодно.

Полиморфизм обозначает, что при обращении рыба.Плыть() реальная реализация процедуры Плыть() при компиляции еще неизвестна. Происходитдинамическое или позднее или виртуальноесвязывание (по всякому говорят), т.е. вызов конкретной процедуры произойдет на этапе выполнения в зависимости от реального типа переменной, которая была передана в данную точку программы.
Т.е. полиморфизм дает виртуализацию кода. Что такое виртуализация? Это неопределенность на этапе компиляции, когда реальное поведение блока кода до конца определяется только в момент его выполнения.

А теперь самая суть ООП - посмотрите на расширение типа данных и на полиморфизм. Суть в том, что ООП позволяет писать код (процедуры и целые модули), которые работают с данными, еще неизвестными в момент написания. Кто угодно может ввести через какое угодно время новые типы рыб, а наш код будет так же хорошо с ними работать, его не потребуется переписывать, а при правильном проектировании - даже перекомпилировать. Т.е. ООП позволяет расширение систем без изменения существующего кода. Вот и все! В этом предложении - вся суть ООП. ПРочтете в какой-нибудь "макулатуре", что ООП - это "наличие в языке классов и объектов" - выкидывайте эту макулатуру сразу, потому что очень многие языки являются объектно-ориентированными без наличия классов и объектов (кроме Оберонов- Ada, далее - языки функционального программирования, напр.  LISP - и т.п.)