Вот, кстати, простой пример использования инкапсуляции.
Допустим, мы написали модуль для обработки каких-то данных. Назовем его Processor. Данные для обработки он получает от модуля DataSource. Но сначала нам надо как-то отладить Processor, а для этого нужно сгенерировать данные с заранее известными свойствами. Для этого пишем модуль SimulatedData c тем же интерфейсом, что и DataSource, и подставим его в Processor вместо DataSource:

MODULE Processor;

IMPORT DataSource := SimulatedData;

Если нам потребуется брать данные с какого-то третьего источника, просто напишем для этого модуль DataSource2 и точно также подставим его вместо DataSource. Причем написать этот модуль можно поручить другому программисту - нам совершенно неважно, как он получение этих данных реализует. Главное, чтобы интерфейс модуля был тот же самый.