W Cat - Описание языка PascalABC.NET
- Название:Описание языка PascalABC.NET
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
W Cat - Описание языка PascalABC.NET краткое содержание
PascalABC.NET — это язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, сборку мусора, лямбда-выражения, средства параллельного программирования.
PascalABC.NET является мультипарадигменным языком: на нем можно программировать в структурном, объектно-ориентированном и функциональном стилях.
PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм.
Описание языка PascalABC.NET - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Принципиальное отличие индексных свойств от полей-массивов состоит в том, что тип индекса может быть произвольным (в частности, строковым). Это позволяет легко реализовать так называемые ассоциативные массивы, элементы которых индексируются строками.
В следующем примере индексное свойство используется для закрашивания/стирания клеток шахматной доски в графическом режиме.
usesGraphABC;
const
n = 8;
sz = 50;
typeChessBoard = class
private
a: array[1..n,1..n] ofboolean;
proceduresetCell(x,y: integer; value: boolean);
begin
ifvalue then
Brush.Color := clWhite
elseBrush.Color := clBlack;
Fillrect((x-1)*sz+1,(y-1)*sz+1,x*sz,y*sz);
a[x,y] := value;
end;
functiongetCell(x,y: integer): boolean;
begin
Result := a[x,y];
end;
public
propertyCells[x,y: integer]: boolean readgetCell writesetCell; default;
end;
varc: ChessBoard := new ChessBoard;
begin
var x,y: integer;
forx:=1 ton do
fory:=1 ton do
c[x,y] := Odd(x+y);
end.
Наследование
Класс может быть унаследован от другого класса. Класс, от которого наследуют, называют базовым классом ( надклассом , предком ), а класс, который наследуется, называется производным классом ( подклассом , потомком ). При наследовании все поля, методы и свойства базового класса переходят в производный класс, кроме этого, могут быть добавлены новые поля, методы и свойства и переопределены (замещены) старые методы. Конструкторы наследуются по особым правилам, которые рассматриваются здесь.
При описании класса его базовый класс указывается в скобках после слова class.
Например:
type
BaseClass = class
procedurep;
procedureq(r: real);
end;
MyClass = class(BaseClass)
procedurep;
procedurer(i: integer);
end;
В данном примере процедура p переопределяется, а процедура r добавляется в класс MyClass.
Если не указать имя базового класса, то считается, что класс наследуется от класса Object - предка всех классов. Например, BaseClass наследуется от Object.
Переопределение методов при наследовании рассматривается здесь.
Перед словом classможет быть указано ключевое слово final– в этом случае от класса запрещено наследовать.
Переопределение методов
Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited(англ.- унаследованный). Например:
type
Person = class
privat e
name: string;
age: integer;
public
constructorCreate(nm: string; ag: integer);
begin
name := nm;
age := ag;
end;
procedurePrint;
begin
writeln('Имя: ',name,' Возраст: ',age);
end;
end;
Student = class(Person)
private
course, group: integer;
public
constructorCreate(nm: string; ag,c,gr: integer);
begin
inheritedCreate(nm,ag);
course := c;
group := gr;
end;
procedurePrint;
begin
inheritedPrint;
writeln('Курс: ',course,' Группа: ',group);
end;
end;
Здесь метод Print производного класса Student вызывает вначале метод Print, унаследованный от базового класса Person, с помощью конструкции inheritedPrint. Аналогично конструктор Create класса Student вызывает вначале конструктор Create базового класса Person, также используя служебное слово inherited.
Правила наследования конструкторов рассматриваются здесь.
Следует обратить внимание, что конструктор базового класса вызывается в этом случае как процедура, а не как функция, при этом создания нового объекта не происходит.
Если в методе вызывается метод базового класса с теми же параметрами, то можно использовать запись inherited, не указывая имя метода и параметры. Например, метод Student.Print можно записать таким образом:
procedurePrint;
begin
inherited;
writeln('Курс: ',course,' Группа: ',group);
end;
Наследование конструкторов
Правила наследования конструкторов - достаточно сложные. В разных языках программирования приняты разные решения на этот счет. В частности, в Delphi Object Pascal все конструкторы наследуются. В .NET, напротив, конструкторы не наследуются. Причина такого решения - каждый класс сам должен отвечать за инициализацию своих экземпляров. Единственное исключение в .NET - если класс вовсе не определяет конструкторов, то автоматически генерируется конструктор без параметров, называемый конструктором по умолчанию.
В PascalABC.NETпринято промежуточное решение. Если класс не определяет конструкторов, то все конструкторы предка автоматически генерируются в потомке, вызывая соответствующие конструкторы предка (можно также говорить, что они наследуются). Если в классе определяются конструкторы, то конструкторы предка не генерируются. Конструктор по умолчанию, если он явно не определен, генерируется автоматически в любом случае и является protected.
Кроме того, в .NET обязательно в конструкторе потомка первым оператором должен быть вызван конструктор предка; в Object Pascal это необязательно. Если в PascalABC.NETконструктор предка вызывается из конструктора потомка, то этот вызов должен быть первым оператором. Если конструктор предка явно не вызывается из конструктора потомка, то неявно первым оператором в конструкторе потомка вызывается конструктор предка по умолчанию (т.е. без параметров). Если такого конструктора у предка нет (это может быть класс, откомпилированный другим .NET-компилятором или входящий в стандартную библиотеку классов - все классы, откомпилированные PascalABC.NET, имеют конструктор по умолчанию), то возникает ошибка компиляции.
Например:
type
A = class
i: integer;
// конструктор по умолчанию не определен явно, поэтому генерируется автоматически
constructorCreate(i: integer);
begin
Self.i := i;
end;
end;
B = class(A)
j: integer;
constructorCreate;
begin
// конструктор по умолчанию базового класса вызывается автоматически
// конструктор по умолчанию определен явно, поэтому не генерируется автоматически
j := 1;
end;
constructorCreate(i,j: integer);
begin
inherite dCreate(i);
Self.j := j;
end;
end;
C = class(B)
// класс не определяет конструкторов, поэтому
// конструктор по умолчанию и constructorCreate(i,j: integer)
// генерируются автоматически, вызывая в своем теле соответствующие конструкторы предка
end;
Читать дальшеИнтервал:
Закладка: