W Cat - Описание языка PascalABC.NET
- Название:Описание языка PascalABC.NET
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
W Cat - Описание языка PascalABC.NET краткое содержание
PascalABC.NET — это язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, сборку мусора, лямбда-выражения, средства параллельного программирования.
PascalABC.NET является мультипарадигменным языком: на нем можно программировать в структурном, объектно-ориентированном и функциональном стилях.
PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм.
Описание языка PascalABC.NET - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
varp: Person;
p := Person.Create('Иванов',20);
2 способ.С помощью операции new - в стиле C# (предпочтительный).
varp: Person;
p := new Person('Иванов',20);
Деструктор в Object Pascal - специальная процедура, уничтожающая объект и освобождающая динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedureиспользуется служебное слово destructor.
Например:
destructorDestroy;
begin
...
end;
Поскольку в PascalABC.NETпамять управляется сборщиком мусора, деструктор в PascalABC.NETне играет никакой роли и представляет собой обычную процедуру-метод.
Предварительное объявление классов
Два или более класса могут содержать в качестве полей объекты других классов, циклически ссылающиеся друг на друга.
Например:
type
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Данный код вызовет ошибку компиляции, поскольку тип BBB в момент описания поля b еще не определен. В такой ситуации следует воспользоваться предварительным описанием класса в виде
ИмяКласса = class;
Предварительно описанный класс должен быть полностью описан в той же секции type:
type
BBB = class;
AAA = class
b: BBB;
end;
BBB = class
a: AAA;
end;
Переменная Self
Внутри каждого нестатического метода неявно определяется переменная Self, ссылающаяся на объект, вызвавший этот метод.
Например:
type
A = class
i: integer;
constructorCreate(i: integer);
begin
Self.i := i;
end;
end;
В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create. Фактически в любом нестатическом методе перед именем любого поля и методу этого класса неявно присутствует Self.
Свойства
Свойство внешне выглядит как поле класса, однако, при доступе к нему на чтение или запись позволяет выполнять некоторые действия. Свойство описывается в классе следующим образом:
propertyProp: тип readимя функции чтения writeимя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью функции чтения , а меняет - с помощью процедуры записи . Функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
functiongetProp: тип;
proceduresetProp(v: тип);
Обычно функция чтения и процедура записи описываются в приватной секции класса. Они могут быть виртуальными, в этом случае их уместно описывать в защищенной секции класса.
Вместо имени функции чтения и имени процедуры записи может фигурировать имя поля, с которым данное свойство связано. Любая из секций readили writeможет быть опущена, в этом случае мы получаем свойство с доступом только на запись или только на чтение.
Например:
type
Person = class
private
nm: string;
ag: integer;
proceduresetAge(a: integer);
begin
ifa>=0 then
ag := a
else raisenew Exception('Возраст не может быть отрицательным');
end;
functiongetId: string;
begin
Result := nm + ag.ToString;
end;
public
...
propertyAge: integer readаg writesetAge;
propertyName: string readnm;
propertyId: string readgetId;
end;
varp: Person;
p := new Person('Иванов',20);
p.Age := -3; // генерируется исключение
vari: integer := p.Age;
writeln(p.Id);
Всякий раз, когда мы присваиваем свойству Age новое значение, вызывается процедура setAge с соответствующим параметром. Всякий раз, когда мы считываем значение свойства Age, происходит обращение к полю ag. Поле nm доступно только на чтение. Наконец, свойство Id осуществляет доступ на чтение к информации, находящейся в двух полях.
Обычно для доступа к полю на чтение в секции readсвойства указывается именно поле, так как обычно при чтении поля никаких дополнительных действий производить не требуется.
Свойства не могут передаваться по ссылке в процедуры и функции. Например, следующий код ошибочен:
Inc(p.Age); // ошибка!
Если требуется обработать значение свойства, передав его по ссылке, то надо воспользоваться вспомогательной переменной:
a := p.Age;
Inc(a);
p.Age := a;
Однако, свойства соответствующих типов можно использовать в левой части операций присваивания += -= *= /=:
p.Age += 1;
Свойства очень удобны при работе с визуальными объектами, поскольку позволяют автоматически перерисовывать объект, если изменить какие-либо его визуальные характеристики. Например, если создана кнопка b1 типа Button, то для визуального изменения ее ширины достаточно присвоить значение ее свойству Width:
b1.Width := 100;
Процедура для записи этого свойства в приватное поле fwidth будет выглядеть примерно так:
procedureSetWidth(w: integer);
begin
if(w>0) and(w<>fwidth) then
begin
fwidth := w;
код перерисовки кнопки
end
end;
Следует обратить внимание на вторую часть условия в операторе if: w<>fwidth. Добавление этой проверки позволяет избежать лишней перерисовки кнопки в случае, если ее ширина не меняется.
Индексные свойства
Индексные свойства ведут себя аналогично полям-массивам и используются, как правило, для доступа к элементам контейнеров. Как и при использовании обычных свойств, при использовании индексных свойств могут попутно выполняться некоторые действия.
Индексное свойство описывается в классе следующим образом:
propertyProp[описание индексов]: тип readимя функции чтения writeимя процедуры записи;
В простейшем случае одного индекса описание индексного свойства выглядит так:
propertyProp[ind: тип индекса]: тип readимя функции чтения writeимя процедуры записи;
В этом случае функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
functionGetProp(ind: тип индекса): тип;
procedureSetProp(ind: тип индекса; v: тип);
Всякий раз, когда мы для объекта a, содержащего свойство Prop, выполняем присваивание a.Prop[ind] := value, вызывается процедура SetProp(ind,value), а когда считываем значение a.Prop[ind], вызывается функция GetProp(ind).
Индексное свойство, после которого добавлено ключевое слово defaultс последующей ;, называется индексным свойством по умолчанию и позволяет пользоваться объектами класса как массивами, т.е. использовать запись a[ind] вместо a.Prop[ind].
Читать дальшеИнтервал:
Закладка: