Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OOP.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
294 Кб
Скачать
☆

17. Ссылочная модель объектов Delphi

Использование памяти в Delphi осуществляется в соответствии со следующими правилами. 1) Прежде чем использовать объект, его нужно создать. 2) После использования ненужный объект нужно уничтожить. 3)Уничтожать объект допускается только один раз. Необходимо ли писать это вручную? Delphi предлагает 3 разновидности управления памятью для динамических переменных, т.е. тех, которые располагаются в куче. 1) Если объект создаётся явно в коде приложения, значит уничтожать его необходимо самостоятельно, иначе занимаемая им память будет недоступна другим объектам. 2)Если мы создаём компонент, то можно указать другой компонент, который будет являться его владельцем. При этом владелец компонента передается конструктору компонента в качестве аргумента. Владелец становится ответственным за все уничтожение объектов, которыми он владеет, т.е. при уничтожении форма уничтожает все компоненты, которыми она владеет. 3) Когда выделяется память для строк динамических массивов и объектов, представленных переменными интерфейсов, Delphi автоматически освобождает память в момент выхода из области видимости ссылки. Однократное освобождение объектов. Если обратиться к деструктору Destroy дважды, произойдёт ошибка. Если не забыть установить ссылку на объект в nil, то к методу Free можно обращаться несколько раз без каких-либо проблем. Free – это статический метод, и его адрес известен во время компиляции, а Destroy – виртуальный метод, адрес которого определяется в процессе выполнения программы. При этом осуществляется анализ типа объекта – опасная операция в случае не существования объекта. if assigned(anObj) then … if anObj <> nil then…

18. Наследование

В ООП имеется возможность определить новый класс на основе существующего. Эта технология называется наследованием (созданием производного класса). Механизм наследования является одним из фундаментальных элементов ООП. Для определения подкласса необходимо указать предка в начале объявления.

Пример:

Delphi каждый раз это автоматически делает при создании новой формы.

Tform1 = class (Tform)

…….;

Класс TForm1 наследует все поля, методы и т.п. от класса TForm. Т.е. можно применить в отношении объекта TForm1 любой публичный метод класса Tform. Класс Tform в свою очередь наследует некоторые из своих методов от другого класса и так вплоть до класса TObject, который явлеется предком любого класса в Object Pascal’e.

Пример:

Создадим новую версию класса TDate в котором будет изменена функция GetText;

TNewDate = class (TDate)

Public

Function GetText : string;

End;

Класс TNewDate порождается от класса Tdate. Говорят: Tdate явл.классом предком или родительским классом для TNewDate.

TNewDate это производный класс, класс потомок, дочерний класс для Tdate. Код метода GetText класса TNewDate будет откомпилирован без ошибок только в случае, если написать его в том же модуле, в котором находится класс Tdate. Выход – protected. Описание большинства полей как protected делает классы более гибкими и упрощает написание подклассов. Но это разрушает идею инкапсуляции. Гибкость и инкапсуляция зачастую являются прямопротивоположными целями. Если приходится выбирать – предпочтение надо отдавать инкапсуляции. Иначе программа не будет соответствовать принципам ООП. (Однако не стоит забывать, что модульность это тоже инкапсуляция). Использование инкапсуляции с достаточной гибкостью позволяет обеспечить механизм позднего связывания. Для использования механизма наследования в Delphi необходимо в объявлении класса справа от слова class указать класс предок:{ TAncestor = class private protected public procedure VirtualProcedure; virtual; abstract; procedure StaticProcedure; end; TDescendant = class(TAncestor) private protected public procedure VirtualProcedure; override; procedure StaticProcedure; end;}Абсолютно все классы в Delphi являются потомками класса TObject. Если класс-предок не указан, то подразумевается, что новый класс является прямым потомком класса TObject.