W Cat - Описание языка PascalABC.NET
Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Описание языка PascalABC.NET"
Описание и краткое содержание "Описание языка PascalABC.NET" читать бесплатно онлайн.
PascalABC.NET — это язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, сборку мусора, лямбда-выражения, средства параллельного программирования.
PascalABC.NET является мультипарадигменным языком: на нем можно программировать в структурном, объектно-ориентированном и функциональном стилях.
PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм.
begin
Self.i := i;
end;
end;
В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create. Фактически в любом нестатическом методе перед именем любого поля и методу этого класса неявно присутствует Self.
Свойства
Свойство внешне выглядит как поле класса, однако, при доступе к нему на чтение или запись позволяет выполнять некоторые действия. Свойство описывается в классе следующим образом:
property Prop: тип read имя функции чтения write имя процедуры записи;
Как правило, каждое свойство связано с некоторым полем класса и возвращает значение этого поля с помощью функции чтения, а меняет - с помощью процедуры записи. Функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
function getProp: тип;
procedure setProp(v: тип);
Обычно функция чтения и процедура записи описываются в приватной секции класса. Они могут быть виртуальными, в этом случае их уместно описывать в защищенной секции класса.
Вместо имени функции чтения и имени процедуры записи может фигурировать имя поля, с которым данное свойство связано. Любая из секций read или write может быть опущена, в этом случае мы получаем свойство с доступом только на запись или только на чтение.
Например:
type
Person = class
private
nm: string;
ag: integer;
procedure setAge(a: integer);
begin
if a>=0 then
ag := a
else raise new Exception('Возраст не может быть отрицательным');
end;
function getId: string;
begin
Result := nm + ag.ToString;
end;
public
...
property Age: integer read аg write setAge;
property Name: string read nm;
property Id: string read getId;
end;
var p: Person;
p := new Person('Иванов',20);
p.Age := -3; // генерируется исключение
var i: 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 будет выглядеть примерно так:
procedure SetWidth(w: integer);
begin
if (w>0) and (w<>fwidth) then
begin
fwidth := w;
код перерисовки кнопки
end
end;
Следует обратить внимание на вторую часть условия в операторе if: w<>fwidth. Добавление этой проверки позволяет избежать лишней перерисовки кнопки в случае, если ее ширина не меняется.
Индексные свойства
Индексные свойства ведут себя аналогично полям-массивам и используются, как правило, для доступа к элементам контейнеров. Как и при использовании обычных свойств, при использовании индексных свойств могут попутно выполняться некоторые действия.
Индексное свойство описывается в классе следующим образом:
property Prop[описание индексов]: тип read имя функции чтения write имя процедуры записи;
В простейшем случае одного индекса описание индексного свойства выглядит так:
property Prop[ind: тип индекса]: тип read имя функции чтения write имя процедуры записи;
В этом случае функция чтения и процедура записи должны быть методами этого класса и иметь следующий вид:
function GetProp(ind: тип индекса): тип;
procedure SetProp(ind: тип индекса; v: тип);
Всякий раз, когда мы для объекта a, содержащего свойство Prop, выполняем присваивание a.Prop[ind] := value, вызывается процедура SetProp(ind,value), а когда считываем значение a.Prop[ind], вызывается функция GetProp(ind).
Индексное свойство, после которого добавлено ключевое слово default с последующей ;, называется индексным свойством по умолчанию и позволяет пользоваться объектами класса как массивами, т.е. использовать запись a[ind] вместо a.Prop[ind].
Принципиальное отличие индексных свойств от полей-массивов состоит в том, что тип индекса может быть произвольным (в частности, строковым). Это позволяет легко реализовать так называемые ассоциативные массивы, элементы которых индексируются строками.
В следующем примере индексное свойство используется для закрашивания/стирания клеток шахматной доски в графическом режиме.
uses GraphABC;
const
n = 8;
sz = 50;
type ChessBoard = class
private
a: array [1..n,1..n] of boolean;
procedure setCell(x,y: integer; value: boolean);
begin
if value then
Brush.Color := clWhite
else Brush.Color := clBlack;
Fillrect((x-1)*sz+1,(y-1)*sz+1,x*sz,y*sz);
a[x,y] := value;
end;
function getCell(x,y: integer): boolean;
begin
Result := a[x,y];
end;
public
property Cells[x,y: integer]: boolean read getCell write setCell; default;
end;
var c: ChessBoard := new ChessBoard;
begin
var x,y: integer;
for x:=1 to n do
for y:=1 to n do
c[x,y] := Odd(x+y);
end.
Наследование
Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют базовым классом (надклассом, предком), а класс, который наследуется, называется производным классом (подклассом, потомком). При наследовании все поля, методы и свойства базового класса переходят в производный класс, кроме этого, могут быть добавлены новые поля, методы и свойства и переопределены (замещены) старые методы. Конструкторы наследуются по особым правилам, которые рассматриваются здесь.
При описании класса его базовый класс указывается в скобках после слова class.
Например:
type
BaseClass = class
procedure p;
procedure q(r: real);
end;
MyClass = class(BaseClass)
procedure p;
procedure r(i: integer);
end;
В данном примере процедура p переопределяется, а процедура r добавляется в класс MyClass.
Если не указать имя базового класса, то считается, что класс наследуется от класса Object - предка всех классов. Например, BaseClass наследуется от Object.
Переопределение методов при наследовании рассматривается здесь.
Перед словом class может быть указано ключевое слово final – в этом случае от класса запрещено наследовать.
Переопределение методов
Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited (англ.- унаследованный). Например:
type
Person = class
private
name: string;
age: integer;
public
constructor Create(nm: string; ag: integer);
begin
name := nm;
age := ag;
end;
procedure Print;
begin
writeln('Имя: ',name,' Возраст: ',age);
end;
end;
Student = class(Person)
private
course, group: integer;
public
constructor Create(nm: string; ag,c,gr: integer);
begin
inherited Create(nm,ag);
course := c;
group := gr;
end;
procedure Print;
begin
inherited Print;
writeln('Курс: ',course,' Группа: ',group);
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Описание языка PascalABC.NET"
Книги похожие на "Описание языка PascalABC.NET" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "W Cat - Описание языка PascalABC.NET"
Отзывы читателей о книге "Описание языка PascalABC.NET", комментарии и мнения людей о произведении.