Какое из свойств скрывает внутренние данные объекта
Во время построения объектной модели задачи мы выделили отдельные объекты, которые для обмена данными друг с другом используют интерфейс — внешние свойства и методы. При этом все внутренние данные и детали внутреннего устройства объекта должны быть скрыты от «внешнего мира». Такой подход позволяет:
• обезопасить внутренние данные (поля) объекта от изменений (возможно, разрушительных) со стороны других объектов;
• проверять данные, поступающие от других объектов, на корректность, тем самым повышая надёжность программы;
• переделывать внутреннюю структуру и код объекта любым способом, не меняя его внешние характеристики (интерфейс); при этом никакой переделки других объектов не требуется.
Скрытие внутреннего устройства объектов называют инкапсуляцией («помещение в капсулу»).
Заметим, что в объектно-ориентированном программировании инкапсуляцией также называют объединение данных и методов работы с ними в одном объекте.
Разберём простой пример. Во многих системах программирования есть класс, описывающий свойства «пера», которое используется при рисовании линий в графическом режиме. Назовём этот класс ТРеп, в простейшем варианте он будет содержать только одно поле Color, которое определяет цвет. Будем хранить код цвета в виде символьной строки, в которой записан шестнадцатеричный код составляющих модели RGB. Например, ‘FFOOFF’ — это фиолетовый цвет, потому что красная (R) и синяя (В) составляющие равны FF16 = 255, а зелёной составляющей нет вообще. Класс можно объявить так: type ТРеп = class
Color: string; end;
По умолчанию все члены класса (поля и методы) открытые, общедоступные (англ. public). Те элементы, которые нужно скрыть, в описании класса помещают в «частный» раздел (англ. private), например, так:
type ТРеп = class private
FColor: string; end;
В этом примере поле FColor закрытое. Имена всех закрытых полей далее будем начинать с буквы «F» (от англ. field — поле). К закрытым полям нельзя обратиться извне (это могут делать только методы самого объекта), поэтому теперь невозможно не только изменить внутренние данные объекта, но и просто узнать их значения. Чтобы решить эту проблему, нужно добавить к классу ещё два метода: один из них будет возвращать текущее значение поля FColor, а второй — присваивать полю новое значение. Эти методы доступа назовем getColor (в переводе с англ. — получить Color) и setColor (в переводе с англ. — установить Color):
type TPen=class private
FColor: string; public
function getColor: string; procedure setColor(newColor: string); end;
Обратите внимание, что оба метода находятся в секции public (общедоступные).
Что же улучшилось по сравнению с первым вариантом (когда поле было открытым)? Согласно принципам ООП, внутренние поля объекта должны быть доступны только с помощью методов. В этом случае внутреннее представление данных может как угодно отличаться от того, как другие объекты «видят» эти данные.
В простейшем случае метод getColor можно написать так:
function TPen.getColor: string; begin
Result:=FColor; end;
В методе setColor мы можем обрабатывать ошибки, не разрешая присваивать полю недопустимые значения. Например, установим, что символьная строка с кодом цвета, передаваемая нашему объекту, должна состоять из шести символов. Если эти условия не выполняются, будем записывать в поле FColor код чёрного цвета ’000000′:
procedure TPen.setColor(newColor: string); begin
if Length(newColor)<>6 then
FColor:=’000000′ { если ошибка, то чёрный цвет} else FColor:=newColor end;
Теперь если pen — это объект класса TPen, то для установки и чтения его цвета нужно использовать показанные выше методы:
pen.setColor (1FFFF00′); {изменение цвета) writeln( ‘цвет пера: ‘, pen.getColor );
{получение цвета}
Итак, мы скрыли внутренние данные, но одновременно обращение к свойствам стало выглядеть довольно неуклюже: вместо pen. Color : = ‘ FFFF00’ теперь нужно писать pen . setColor (‘FFFF00’) . Чтобы упростить запись, во многие объектно-ориентированные языки программирования ввели понятие свойства (англ. property), которое внешне выглядит как переменная объекта, но на самом деле при записи и чтении свойства вызываются методы объекта.
Свойство — это способ доступа к внутреннему состоянию объекта, имитирующий обращение к его внутренней переменной.
Свойство color в нашем случае можно определить так:
type TPen = class private
FColor: string; function getColor: string; procedure setColor(newColor: string); public
property color: string read getColor
write setColor;
end;
Здесь методы getColor и setColor перенесены в раздел private, т. е. закрыты от других объектов. Однако есть общедоступное свойство color строкового типа:
property color: string read getColor
write setColor;
При чтении этого свойства (англ. read) вызывается метод getColor, а при записи нового значения (англ. write) — метод setColor. В программе можно использовать это свойство так:
pen.color:=’FFFF001; {изменение цвета}
writeln( ‘цвет пера: ‘, pen.Color );
{получение цвета}
Поскольку приведённая выше функция getColor просто возвращает значение поля FColor и не выполняет никаких дополнительных действий, можно было вообще удалить метод getColor и объявить свойство так:
property color: string read FColor write setColor;
В этом случае при чтении выполняется прямой доступ к полю.
Таким образом, с помощью свойства color другие объекты могут изменять и читать цвет объектов класса TPen. Для обмена данными с «внешним миром» важно лишь то, что свойство color — символьного типа, и оно содержит 6-символьный код цвета. При этом внутреннее устройство объектов TPen может быть любым, и его можно менять как угодно. Покажем это на примере.
Хранение цвета в виде символьной строки неэкономно и неудобно, так как большинство стандартных функций используют числовые коды цвета. Поэтому лучше хранить код цвета как целое число, и поле FColor сделать целого типа:
FColor: integer;
При этом необходимо поменять методы getColor и setColor, которые непосредственно работают с этим полем:
function ТРеп.getColor: string;
begin
Result:=IntToHex(FColor,6);
end;
procedure TPen.setColor(newColor: string);
begin
if Length(newColor)<>6 then
FColor:=0 {если ошибка, то чёрный цвет} else begin
FColor:=StrToInt(1 $’+newColor); end;
end;
Для перевода числового кода в символьную запись используется функция IntToHex, входящая в библиотеку FreePascal (модуль SysUtils). Её второй параметр — количество цифр, которое будет в шестнадцатеричном числе. Обратный перевод выполняет функция StrToInt. Для того чтобы указать, что число записано в шестнадцатеричной системе, перед ним добавляют символ $.
В этом примере мы принципиально изменили внутреннее устройство объекта: заменили строковое поле на целочисленное. Однако другие объекты даже не «догадаются» о такой замене, потому что сохранился интерфейс — свойство color по-прежнему имеет строковый тип. Таким образом, инкапсуляция позволяет как угодно изменять внутреннее устройство объектов, не затрагивая интерфейс. При этом все остальные объекты изменять не требуется.
Иногда не нужно разрешать другим объектам менять свойство, т. е. требуется сделать свойство «только для чтения» (англ. read-only). Пусть, например, мы строим программную модель автомобиля. Как правило, другие объекты не могут непосредственно менять его скорость, однако могут получить информацию о ней — «прочитать» значение скорости. При описании такого свойства слово write и название метода записи не указывают вообще:
type ТСаг = class private Fv: real;
public
property v: real read Fv; end;
Таким образом, доступ к внутренним данным объекта возможен, как правило, только с помощью методов. Применение свойств (property) очень удобно, потому что позволяет использовать ту же форму записи, что и при работе с общедоступной переменной объекта.
При использовании скрытия данных длина программы чаще всего увеличивается, однако мы получаем и важные преимущества. Код, связанный с объектом, разделён на две части: общедоступную часть (секция public) и закрытую (private). Объект
взаимодействует с другими объектами только с помощью своих общедоступных свойств и методов (интерфейс) — рис. 7.8.
Поэтому при сохранении интерфейса можно как угодно менять внутреннюю структуру данных и код методов, и это никак не будет влиять на другие объекты. Подчеркнём, что всё это становится действительно важно, когда разрабатывается большая программа и необходимо обеспечить её надёжность.
Вопросы и задания
1. Что такое интерфейс объекта?
2. Что такое инкапсуляция? Каковы её цели?
3. Чем различаются секции public и private в описании классов? Как определить, в какую из них поместить свойство или метод?
4. Почему рекомендуют делать доступ к полям объекта только с помощью методов?
5. Что такое свойство? Зачем во многие языки программирования введено это понятие?
6. Можно ли с помощью свойства обращаться напрямую к полю объекта, не используя метод?
7. Почему методы доступа, которые использует свойство, делают закрытыми?
8. Зачем нужны свойства «только для чтения»? Приведите примеры.
9. Подумайте, в каких ситуациях может быть нужно свойство «только для записи» (которое нельзя прочитать). Как ввести такое свойство в описание класса? Приведите примеры.
Подготовьте сообщение
а) «Инкапсуляция в языке Си»
б) «Инкапсуляция в языке Javascript»
в) «Инкапсуляция в языке Python»
Возрат в главу
Календарь | ||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Статистика |
---|
Онлайн всего: 1 Гостей: 1 Пользователей: |
Волею судьбы мне приходится читать спецкурс по паттернам проектирования в вузе. Спецкурс обязательный, поэтому, студенты попадают ко мне самые разные. Конечно, есть среди них и практикующие программисты. Но, к сожалению, большинство испытывают затруднения даже с пониманием основных терминов ООП.
Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).
Первая часть посвящена классам, объектам и интерфейсам.
Вторая часть, представленная ниже, иллюстрирует инкапсуляцию, полиморфизм и наследование
Инкапсуляция
Представим на минутку, что мы оказались в конце позапрошлого века, когда Генри Форд ещё не придумал конвейер, а первые попытки создать автомобиль сталкивались с критикой властей по поводу того, что эти коптящие монстры загрязняют воздух и пугают лошадей. Представим, что для управления первым паровым автомобилем необходимо было знать, как устроен паровой котёл, постоянно подбрасывать уголь, следить за температурой, уровнем воды. При этом для поворота колёс использовать два рычага, каждый из которых поворачивает одно колесо в отдельности. Думаю, можно согласиться с тем, что вождение автомобиля того времени было весьма неудобным и трудным занятием.
Теперь вернёмся в сегодняшний день к современным чудесам автопрома с коробкой-автоматом. На самом деле, по сути, ничего не изменилось. Бензонасос всё так же поставляет бензин в двигатель, дифференциалы обеспечивают поворот колёс на различающиеся углы, коленвал превращает поступательное движение поршня во вращательное движение колёс. Прогресс в другом. Сейчас все эти действия скрыты от пользователя и позволяют ему крутить руль и нажимать на педаль газа, не задумываясь, что в это время происходит с инжектором, дроссельной заслонкой и распредвалом. Именно сокрытие внутренних процессов, происходящих в автомобиле, позволяет эффективно его использовать даже тем, кто не является профессионалом-автомехаником с двадцатилетним стажем. Это сокрытие в ООП носит название инкапсуляции.
Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали
реализации от пользователя.
Инкапсуляция неразрывно связана с понятием интерфейса класса. По сути, всё то, что не входит в интерфейс, инкапсулируется в классе.
Абстракция
Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерён в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота (ну и, возможно, пепельницу) он будет использовать регулярно.
Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция – это набор всех таких характеристик.
Если бы для моделирования поведения автомобиля приходилось учитывать химический состав краски кузова и удельную теплоёмкость лампочки подсветки номеров, мы никогда бы не узнали, что такое NFS.
Полиморфизм
Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, ВАЗ 2106 не мог потом водить ВАЗ 2110 или BMW X3. С другой стороны, трудно представить человека, который смог бы нормально управлять автомобилем, в котором педаль газа находится левее педали тормоза, а вместо руля – джойстик.
Всё дело в том, что основные элементы управления автомобиля имеют одну и ту же конструкцию и принцип действия. Водитель точно знает, что для того, чтобы повернуть налево, он должен повернуть руль, независимо от того, есть там гидроусилитель или нет.
Если человеку надо доехать с работы до дома, то он сядет за руль автомобиля и будет выполнять одни и те же действия, независимо от того, какой именно тип автомобиля он использует. По сути, можно сказать, что все автомобили имеют один и тот же интерфейс, а водитель, абстрагируясь от сущности автомобиля, работает именно с этим интерфейсом. Если водителю предстоит ехать по немецкому автобану, он, вероятно выберет быстрый автомобиль с низкой посадкой, а если предстоит возвращаться из отдалённого маральника в Горном Алтае после дождя, скорее всего, будет выбран УАЗ с армейскими мостами. Но, независимо от того, каким образом будет реализовываться движение и внутреннее функционирование машины, интерфейс останется прежним.
Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Например, если вы читаете данные из файла, то, очевидно, в классе, реализующем файловый поток, будет присутствовать метод похожий на следующий: byte[] readBytes( int n );
Предположим теперь, что вам необходимо считывать те же данные из сокета. В классе, реализующем сокет, также будет присутствовать метод readBytes. Достаточно заменить в вашей системе объект одного класса на объект другого класса, и результат будет достигнут.
При этом логика системы может быть реализована независимо от того, будут ли данные прочитаны из файла или получены по сети. Таким образом, мы абстрагируемся от конкретной специализации получения данных и работаем на уровне интерфейса. Единственное требование при этом – чтобы каждый используемый объект имел метод readBytes.
Наследование
Представим себя, на минуту, инженерами автомобильного завода. Нашей задачей является разработка современного автомобиля. У нас уже есть предыдущая модель, которая отлично зарекомендовала себя в течение многолетнего использования. Всё бы хорошо, но времена и технологии меняются, а наш современный завод должен стремиться повышать удобство и комфорт выпускаемой продукции и соответствовать современным стандартам.
Нам необходимо выпустить целый модельный ряд автомобилей: седан, универсал и малолитражный хэтч-бэк. Очевидно, что мы не собираемся проектировать новый автомобиль с нуля, а, взяв за основу предыдущее поколение, внесём ряд конструктивных изменений. Например, добавим гидроусилитель руля и уменьшим зазоры между крыльями и крышкой капота, поставим противотуманные фонари. Кроме того, в каждой модели будет изменена форма кузова.
Очевидно, что все три модификации будут иметь большинство свойств прежней модели (старый добрый двигатель 1970 года, непробиваемая ходовая часть, зарекомендовавшая себя отличным образом на отечественных дорогах, коробку передач и т.д.). При этом каждая из моделей будет реализовать некоторую новую функциональность или конструктивную особенность. В данном случае, мы имеем дело с наследованием.
Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.
Необходимо отметить, что производный класс полностью удовлетворяет спецификации родительского, однако может иметь дополнительную функциональность. С точки зрения интерфейсов, каждый производный класс полностью реализует интерфейс родительского класса. Обратное не верно.
Действительно, в нашем примере мы могли бы произвести с новыми автомобилями все те же действия, что и со старым: увеличить или уменьшить скорость, повернуть, включить сигнал поворота. Однако, дополнительно у нас бы появилась возможность, например, включить противотуманные фонари.
Отсутствие обратной совместимости означает, что мы не должны ожидать от старой модели корректной реакции на такие действия, как включения противотуманок (которых просто нет в данной модели).
тесты по теме основы ООП с ответами. Внимание! Все ответы под А.
1. Укажите принципы объектно-ориентированного программирования:
a) Инкапсуляция, наследование, полиморфизм
2. Инкапсуляция – это…
a) Такое свойство, при котором объекты содержат описание атрибутов и действий одновременно
3. Наследование – это…
a) Такой метод определения объектов, при котором производные объекты наследуют свойства от своих потомков
4. Полиморфизм – это…
a) Такое свойство объектов, при котором действие с одинаковыми именами вызывает различное поведение для различных объектов
5. Объект, обладающий свойством инкапсуляции, характеризуется следующими параметрами:
a) Уникальное имя, набор атрибутов, набор действий для описания своего поведения
6. Атрибуты объекта — это…
a) Данные, характеризующие состояние объекта
7. Укажите верное утверждение.
a) Каждый объект задается именем, свойствами и методами
8. Под объектами понимают …
a) некоторую абстрактную сущность, заданную набором имен атрибутов и имен методов поведения
9. Совокупность объектов, характеризующаяся общностью методов и свойств – это…
a) класс
10. Изменение состояния объекта в ответ на какое-либо действие – это…
a) событие
11. Действие, которое может выполнить объект – это…
a) метод
12. Характеристика объекта – это …
a) свойство
13. Совокупность свойств и методов – это …
a) объект
14. Класс – это…
a) Совокупность объектов, характеризующаяся общностью методов и свойств
15. Событие – это…
a) Изменение состояния объекта в ответ на какое-либо действие
16. Метод – это…
a) Действие, которое может выполнить объект
17. Свойство – это…
a) Характеристика объекта
18. Объект – это…
a) Совокупность свойств и методов
19. Тип, соответствующий классу – это…
a) Объектный тип
20. Компоненты, которые видны во время работы приложения, с ними напрямую может взаимодействовать пользователь, называются…
a) Визуальными
21. Компоненты, которые видны только во время разработки приложения, а во время работы приложения их не видно, но они могут выполнять какую-нибудь работу, называются…
a) Невизуальными
22. Все объекты в Delphi происходят от объекта…
a) TObject
23. Все компоненты имеют среди родственников объект …
a) TComponent
24. Свойство Align отвечает за …
a) выравнивание компонента на форме
25. Свойство Caption отвечает за …
a) название компонента на форме
26. Свойство Name отвечает за …
a) имя компонента
27. Свойство формы Name – это…
a) имя формы, используется для управления формой и доступа к компонентам формы.
28. Свойство формы Тор – это…
a) расстояние от верхней границы формы до верхней границы экрана
29. Свойство формы Caption – это…
a) текст заголовка (надпись на форме)
30. Свойство формы Icon – это…
a) значок в заголовке диалогового окна, обозначающий кнопку вывода системного меню
31. Свойство формы Width – это…
a) ширина формы
32. Этот компонент предназначен для вывода текста на поверхность формы
a) Label
33. Компонент, представляющий собой поле ввода-редактирования строки символов
a) Edit
34. Компонент, представляющий собой командную кнопку – это…
a) Button
35. Компонент, представляющий собой поле для текста, который может состоять из нескольких строк
a) Memo
36. Компонент, представляющий собой независимую кнопку (переключатель)
a) CheckBox
37. Компонент, предоставляющий возможность ввести данные в поле редактирования путем набора на клавиатуре или выбором из списка
a) ComboBox
38. Компонент, представляющий собой таблицу
a) StringGrid
39. Компонент, представляющий собой список, в котором можно выбрать нужный элемент
a) ListBox
40. Свойство компонента TEdit, указывающее цвет фона — …
a) Color
41. Свойство компонента TEdit, указывающее текст в окне редактирования
a) Text
42. Метод компонента TEdit, удаляющий текст из окна редактирования
a) Clear
43. Возникшая в процессе выполнения программы ошибка называется …
a) исключением
44. Событие OnClick в Delphi соответствует …
a) Щелчку кнопкой мыши
45. При перемещении мыши в Delphi происходит событие …
a) OnMouseMove
46. Структура языка, которая может иметь в своем составе переменные, функции и процедуры называется…
a) Класс
47. Объекты, в которые вы помещаете другие объекты для создания пользовательского интерфейса вашего приложения – это…
a) Формы
48. Процедуры и функции, описанные внутри класса и предназначенные для операций над его полями – это…
a) Методы
49. Свойство процедурного типа, предназначенное для создания пользовательской реакции на то или иное входное воздействие – это…
a) Событие
50. Укажите принципы, составляющих суть объектно-ориентированного программирования
a) Инкапсуляция, наследование и полиморфизм.
51. Свойство, определяющее высоту объекта в пикселах.
a) Height
52. Свойство, определяющее ширину объекта в пикселах
a) Width
53. Укажите свойство класса TFont которое содержит дескриптор шрифта
a) Handle
54. Укажите свойство класса TFont которое содержит имя (начертание) шрифта
a) Name
55. Укажите свойство класса TFont которое определяет цвет шрифта
a) TColor
56. Укажите свойство класса TFont которое определяет стиль (особенности начертания) шрифта
a) Style
57. Укажите свойство класса TFont которое определяет число точек на дюйм
a) PixelsPerlnch
58. Укажите свойство класса TFont которое содержит размер шрифта
a) Size
59. Элемент управления: курсор предназначен для
a) быстрой отмены выбора какого-либо объекта
60. Элемент управления: Tmainmenu
a) Позволяет поместить главное меню в программу
61. Элемент управления: tpopupmenu
a) Позволяет создавать всплывающие меню
62. Элемент управления: Tlabel предназначен для
a) отображения текста на экране.
b) быстрой отмены выбора какого-либо объекта
c) представления данных любого типа в виде таблицы
d) отображения простейших графических объектов на форме: окружность, квадрат и т.п.
e) отображения графического изображения на форме.
63. Элемент управления: Tedit представляет собой
a) Стандартный управляющий элемент для ввода данных, который может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.
64. Элемент управления: Tmemo представляет собой
a) Управляющий элемент для ввода, подразумевающий работу с большими текстами.
65. Элемент управления: Tbutton
a) Позволяет выполнить какие-либо действия при нажатии кнопки во время выполнения программы.
66. Элемент управления: Tcheckbox
a) Отображает строку текста с маленьким окошком рядом, в котором можно поставить отметку, которая означает, что что-то выбрано.
67. Элемент управления: Tradiobutton
a) Позволяет выбирать только одну опцию из нескольких.
68. Элемент управления: Tlistbox
a) Используется для показа прокручиваемого списка
69. Элемент управления: TCombobox
a) Используется для показа прокручиваемого списка и позволяет вводить информацию в маленьком поле ввода сверху
70. Элемент управления: TScroll — это
a) Полоса прокрутки, появляющаяся автоматически в объектах редактирования
71. Назначение элемента управления: TGroupBox
a) Используется для визуальных целей и для указания Windows, каков порядок перемещения по компонентам на форме (при нажатии клавиши TAB)
72. Назначение элемента управления: TRadioGroup
a) Используется для группировки объектов TRadioButton
73. Элемент управления: tpanel — это
a) Управляющий элемент, используется в декоративных целях для расположения на нем других компонентов
74. Элемент управления:tbitbtn — это
a) Кнопка, на которой можно поместить картинку
75. Элемент управления: timage
a) Отображает графическое изображение на форме
76. Элемент управления: tshape предназначен для
a) Для отображения простейших графических объектов на форме: окружность, квадрат и т.п.
77. Элемент управления: Tscrollbox
a) Позволяет создать на форме прокручиваемую область с размерами большими, чем экран, на которой можно разместить объекты
78. Элемент управления: Ttimer
a) Используется в программах, где вызываются периодически какие-то события, т. е. устанавливается таймер времени
79. Свойства, значения которых являются числами или строками называются…
a) Перечислимые
80. Свойства, которые могут принимать значения из предопределенного набора (списка) называются…
a) Простые
81. Свойства, которые поддерживают вложенные значения (или объекты) называются…
a) Вложенные
82. Какая структура языка Delphi используется для выбора, когда есть два возможных выбора
a) if-then-else
83. Какой оператор передает управление на оператор, помеченный меткой
a) goto
84. Оператор Delphi обозначающий цикл с постусловием
a) repeat _until
85. Оператор Delphi обозначающий цикл с предусловием
a) while_do
86. Оператор Delphi обозначающий цикл с параметром
a) for
87. Структура языка Delphi используемая для выбора, когда есть многозначное ветвление
a) case-of
88. Структура языка Delphi выполняющая действие один раз и повторяющая его до тех пор, пока условие станет верным
a) repeat-until
89. Структура языка Delphi повторяющая действие пока сохраняет силу некоторое условие
a) while-do
90. Свойство ReadOnly компонента Edit — …
a) Указывает, может ли пользователь изменять текст в компоненте
Конец тестов тесты по теме Тесты заочного отделения по основам ООП. Ответы на тест под вариантом А.