Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | <P STYLE="margin-bottom: 0cm">ЯП 02.11.06</P>
| + | == From Ebaums Inc to MurkLoar. == |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | We at EbaumsWorld consider you as disgrace of human race. |
- | </P>
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | <P STYLE="margin-bottom: 0cm">Определение типов с помощью механизма
| + | Dig yourself a grave - you will need it. |
- | классов.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Специальные функции:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Конструкторы</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Деструкторы</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Операторы преобразования</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Свойства</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">Спец функ – с одной стороны
| + | |
- | функции, с другой у них есть некая семантика, компилятор умеет
| + | |
- | вызывать их сам в некоторых случаях. Конструкетор вызывается при
| + | |
- | создании объекта, деструкторы при уничтожении, операторы
| + | |
- | преобразования при необходимости преобр.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">У С. Были задумки, что бы были спец
| + | |
- | функции, которые вызываются при входе и выходе из блока.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Конструктор</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С++ с точки зрения наиболее богатый
| + | |
- | язык, потому что сущ три класса памяти:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Статические</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Квазистатические</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Динамические</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">В остальных языках – только
| + | |
- | динамические.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Есть автоматический по умолчанию –
| + | |
- | Х()</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Конструктор копирования – Х(Х&),
| + | |
- | X(const X&)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">конструктор преобразования –
| + | |
- | X(T), X(T&), X(const T&)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">все остальные</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Аде ещё пытались решить проблему
| + | |
- | инициализации объпектов:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">record
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> TOP: integer = 1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> Body: array (1..N) of T</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Значение 1 присваивается при каждом
| + | |
- | размещении объекта в памяти.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В других модульных ЯП даже такой
| + | |
- | инициализации нет</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В общем случае существуют Init и
| + | |
- | Destroy, и программист-пользователь не должен знать структуру типа
| + | |
- | данных, только вызывает Init и Destroy, но нет языкового механизма,
| + | |
- | который делал бы это принудительно. И прелесть конструкторов в том,
| + | |
- | что они вызываются автоматически.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для статич объектов инициализация до
| + | |
- | main</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для квазистатич – в момент
| + | |
- | объявления</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для динамич – в момент размещ в
| + | |
- | памяти.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В джава-шарп-дельфи только в момент
| + | |
- | размещения. Мы явно вызываем конструктор:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">x = new X(); x = new X(C);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Почему надо выделять
| + | |
- | конструктор-умолчание? Какая умолчательная семантика у этих
| + | |
- | конструкторов? Ведь мы можем считать, что мы их вызываем явно. На
| + | |
- | самом деле всё не совсем так. У каждого конструктора существует
| + | |
- | стандартная семантика, которую может сгенерировать компилятор –
| + | |
- | вызвать конструкторы всех базовых классов, затем конструкторы
| + | |
- | подобъектов; после того, как выполнены инициализаторы, выполняется
| + | |
- | тело конструктора. Поэтому конструктор умолчания – если мы
| + | |
- | явным образом не указали другое, мы вызываем его.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ роль констр по умолчанию более
| + | |
- | широкая – при описании. Мы не можем написать X x(), потому что
| + | |
- | это прототип, хотя написать X x(параметры) – можно. Это
| + | |
- | синтаксическое недоразумение.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Генерируемый конструктор по умолчанию
| + | |
- | делает то же самое, что и указано ранее.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если недоступен какого-то конструктора
| + | |
- | по умолчанию, то генерируется сообщ об ошибке</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В общем случае, тело конструктора имеет
| + | |
- | вид (С++, шарп):</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X (...) : список инициализации { ... }</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class X: public Y {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X (...) : Y(0), z(1); {...}</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для констант и ссылок конструктор –
| + | |
- | единственный способ инициализации.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Базовый класс надо в С++ указывать
| + | |
- | явно, потому что их может быть несколько.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В шарп для базового класса есть
| + | |
- | ключевое слово base.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если вызываются конструкторы
| + | |
- | подобъектов, нужно ли вызывать конструкторы подобъектов? Нет, их
| + | |
- | можно вызывать в списке инициалищаторов.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Джаве нет списка инициализации,
| + | |
- | вместо этого мы конструируем его при объявлении: Y y = new Y();
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Единственный контекст, когда мы должны
| + | |
- | явно вызывать конструктор явно – вызов конструктора базового
| + | |
- | класса: super(...). Если не пишем, вызывается super()</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Копирование:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Два вида:</P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Deep copy – полное
| + | |
- | копирование структуры данных. Если там содержатся указатели, то
| + | |
- | можно ли говорить, что глубокое копирование обязательно? Нет. Только
| + | |
- | программист может дать ответ на этот вопрос. Можно сделать операцию
| + | |
- | Copy, но нельзя заставить её исользовать (с простых языках). В Аде
| + | |
- | есть некий способ, который позволяет заставить программиста
| + | |
- | выполнить операцию Copy. В С++ какой способ управления – мы
| + | |
- | можем переопределить смысл операции присваивания и конструктор
| + | |
- | копирования. С++ - единственный язык, который позволяет
| + | |
- | переопределить операцию присваивания.
| + | |
- | </P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Shallow copy - копируется только
| + | |
- | верхнии уровень, и если структура содерит ссылки на объекты, то это
| + | |
- | может быть неадекватно.</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Во время выполнения конструкции
| + | |
- | копирования два этапа:<BR>1. Инициализация объектов
| + | |
- | </P>
| + | |
- | <OL START=2>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Копирование</P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ делано так - нужно одновременно
| + | |
- | переопределять и операцию копирования, и операцию присваивания.
| + | |
- | Конструктор копир есть у каждого класса, и программист или определяет
| + | |
- | явно, или они генерироваются.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Еслди конструктор копирования
| + | |
- | отсутствуетЮ то конструктор копирования генерируется почленно.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Операция присваивания и копирования –
| + | |
- | разные операции. Люди, которого этого не понимают – страдают.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X a = b – инициализация</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a = b – присваивание, единственны
| + | |
- | контекст, когда присваивание</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <OL>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Инициализация</P>
| + | |
- | <LI><P STYLE="margin-bottom: 0cm">Присваиваине – отслеживание
| + | |
- | присваивания, самого себя, очистка ресурсов
| + | |
- | </P>
| + | |
- | </OL>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Все эти слова относятся только к С++</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В остальных языках всё просто:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Присваивание – копирование
| + | |
- | ссылки.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Семантика присваивание – просто
| + | |
- | копирование ссылки.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Джаве, если класс поддержит интерфейс
| + | |
- | clonable, то там есть операция clone(), которая выдаст копию объекта.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Преобразование типов</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если тип включается в тот, в который
| + | |
- | преобразовываетсЯ то может быть неявное преобразование</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Аде это поставлено на хорошую ногу.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если типы разные, то неявны
| + | |
- | преобразования запрещены.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Явные преобразования разрешаются
| + | |
- | довольно широко.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Неявные преобр разрешаются между
| + | |
- | подтипами.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Вначвале неявные преобр были запрещены
| + | |
- | и в Си с классами. Но новые типы должны быть равномощными
| + | |
- | стандартным.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При переопределении операции (например,
| + | |
- | сложение), возникает гигантское количество необходимых вариантов (по
| + | |
- | 20 на каждую операцию).</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">/*педедыв*/</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Возникает технологическая потребность
| + | |
- | неявного преобр их одного типа в другой. Она является критичность.
| + | |
- | Неявные преобр усложняют компилятор и порождают много тонких ошибок.
| + | |
- | Неслучайно создатели ЯП отвечают по разному. В С++ и шарп
| + | |
- | пользовательские неявные преобр разрешены, в Дельфи и джаве –
| + | |
- | запрещены. Потребность неявных преобр для некотороых типов явл
| + | |
- | критичной. Неслучайно в джаве появился метод ToString() у типа
| + | |
- | Object. И если операция плюс требует строкового типа, то неявно
| + | |
- | вызывает ToString(). Это ничто иное, как неявно преобразование. То же
| + | |
- | самое умеет и компилятор Delphi.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ возникают некоторые проблемы.
| + | |
- | Каким образом можно пользователю давать возможность определять
| + | |
- | преобр? Как метод класса. Например, есть преобр из класса 1 в класс
| + | |
- | 2. И такое преобр может выполняться двумя путями: оперделить
| + | |
- | конструктор T2(T1) – конструктор преобразования.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если X v(10), то всё нормально. Если
| + | |
- | v=5, то типы не совместимые, компилятор начинает искаьб
| + | |
- | преобразование, находит v(5) и вставляет неявное преобразование,
| + | |
- | которое определяет программист.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>В книге С. Рассмотрен класс вектор,
| + | |
- | у которого переопределяется операция индексирования и конструктор
| + | |
- | создания с указанием дллины. При этом одновременно считается, что
| + | |
- | определён конструктор преобразования из типа int. Такое поведение
| + | |
- | неприемлемо.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В вариант С++ появилось ключевое слово
| + | |
- | explicit, которое говорит, что этот конструктор преобразования должен
| + | |
- | вызываться явно. Беда в том, что мы должны писать явно explicit.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Тем не менее, конструкторов
| + | |
- | преобразования недостаточно. Некоторые пробр не выполнить. Например,
| + | |
- | нельзя выполнить преоб из класса в стандартный ТД, из базового класса
| + | |
- | в производный. Его нельзя задать с помощью конструктора, его можно
| + | |
- | задать только с помощью специальных операторов преобр:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">operatorT() {} - такая функция может
| + | |
- | быть только членом класа, и параметров у неё нет.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Когда компилятор встречает</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a=b</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">он начинает искать преобразование, и
| + | |
- | находи т для оператора b преобразование в а, и вставляет это неявное
| + | |
- | преобр. Тут видна опасность преобразования:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Когда расм ТД String – одна из
| + | |
- | причин, в котором String можно описать как библоитечный – в С++
| + | |
- | есть неогр неявные преобразования, есть преобр из const char * и
| + | |
- | обратно. Типичная ошибка – если написать неявный оператор для
| + | |
- | строки, то можно получить неко торые неприятности. Типичный пример:
| + | |
- | как проще всего... в строке есть поле char *, наивная реализация
| + | |
- | метода – возвращения char *, что неверно, ибо ссылка const char
| + | |
- | * уже не будет валидна.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">//пример добавить</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В шарп немного другой синтаксис:
| + | |
- | существуют только операторы преобразования, причём разрешеныы
| + | |
- | проебразования только пользовательских типов.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">OperatorT1</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Сразу возникает вопрос, чьим членом
| + | |
- | должно быть соотв преобразование: решение – оператор должен
| + | |
- | быть статической функцией, и вид у неё operator T1(T2 x), при этом в
| + | |
- | языке C# два ключевых слова – explicit и implicit/ В первом
| + | |
- | случае говорится, что преобр только явное:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">T1 t1;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">T2 t2;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">t1 = t2; - ошибкк, можно только
| + | |
- | t1=(T1)t2;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">во втором – неявное. По умолчанию
| + | |
- | – explicit.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Последняя спецфункция – свойства</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Идеология свойств – проявляет
| + | |
- | дуализм. С ТЗ польхователя – данные, с точки зрения реализации
| + | |
- | – операция set и поерация get. В совр ЯП считается хорошим
| + | |
- | тоном не экспортировать данные, только операции. Это сделано для чего
| + | |
- | -
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С точки зреня совр ЯП данные должны
| + | |
- | быть представлены только в виде свойств.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Обероне для экспорта только на чтение
| + | |
- | можно написать *- (дщля чтения-записи просто звёздочка).</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Механизм get-set позволяет
| + | |
- | программисту-пользователю не затрагивать реализации.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В общем случае механизм свойств очень и
| + | |
- | очень гибкий.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Механизм свойств есть в двух языках –
| + | |
- | шарп и дельфи.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Class X {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> private T y;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> public T x { //фигурная скобка –
| + | |
- | речь идёт о свойстве</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> get() { ... return y; }</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> set() { ... y = value; }</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> }</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">как это выглядит внешне:
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X a = new X();</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">T y;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a.y = y; - на самом деле вызывется
| + | |
- | метод set для свойства set<SUB>x</SUB>(y)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">y = a.x – вызывается get</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Достаточно простой и прозрачный
| + | |
- | синтаксис.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Запрет на чтение или запись делается
| + | |
- | ненаписанием соотв метода.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Дельфи:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">type Y = class ...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">property X:T
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> read указывается имя члена-данного
| + | |
- | либо прототип функции, функция обязана иметь фид function getX():T;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> write указывается имя члена-данного
| + | |
- | либо прототип процедуры, которая обязана иметь dид procedure
| + | |
- | setX(value:T);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Z : Y;
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a:T;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">z.x:=a;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В отличие от шарп, имя произвольное.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Что интересного есть в дельфи –
| + | |
- | свойства по умолчанию. В конце может стоять слово default.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">A:T; b:Y;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">a:=b; - обычно надо генерировать сообщ
| + | |
- | об ошибке, но компилятор смотрит и видит свойство по умолчанию.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для коллекций есть индексеры.</P>
| + | |
- | | + | |
- | {{Языки Программирования}}
| + | |