W Cat - Описание языка PascalABC.NET
- Название:Описание языка PascalABC.NET
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
W Cat - Описание языка PascalABC.NET краткое содержание
PascalABC.NET — это язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, сборку мусора, лямбда-выражения, средства параллельного программирования.
PascalABC.NET является мультипарадигменным языком: на нем можно программировать в структурном, объектно-ориентированном и функциональном стилях.
PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм.
Описание языка PascalABC.NET - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Виртуальные методы и полиморфизм
Полиморфизм (от греч . много форм) - это свойство классов, связанных наследованием, иметь различную реализацию входящих в них методов, и способность переменной базового класса вызывать методы того класса, объект которого содержится в этой переменной в момент вызова метода.
Полиморфизм используется в ситуации, когда для группы взаимосвязанных объектов требуется выполнить единое действие, но каждый из этих объектов должен выполнить указанное действие по-своему (т.е. у действия возникает много форм). Для этого определяется базовый для всех объектов класс с виртуальными методами, предусмотренными для меняющегося поведения, после чего эти методы переопределяется в потомках.
Для пояснения рассмотрим переопределение метода в подклассе:
type
Base = class
public
procedurePrint;
begin
writeln('Base');
end;
end;
Derived = class(Base)
public
procedurePrint;
begin
writeln('Derived');
end;
end;
Присвоим переменной базового класса Base объект производного класса Derived и вызовем метод Print.
varb: Base := new Derived;
b.Print;
Какая версия метода Print вызывается - класса Base или класса Derived? В данном случае решение будет принято еще на этапе компиляции: вызовется метод Print класса Base, заявленного при описании переменной b. Говорят, что имеет место раннее связывание имени метода с его телом. Если же решение о том, какой метод вызывать, принимается на этапе выполнения программы в зависимости от реального типа объекта, на который ссылается переменная b, то в данном случае вызывается метод Derived.Print (говорят также, что имеет место позднее связывание ). Методы, для которых реализуется позднее связывание, называются виртуальными , а переменная базового класса, через которую осуществляется вызов виртуального метода, - полиморфной переменной . Таким образом, полиморфизм реализуется вызовом виртуальных функций через переменную базового класса. Тип класса, который хранится в данной переменной на этапе выполнения, называется динамическим типом этой переменной.
Для того чтобы сделать метод виртуальным, следует в объявлении этого метода после заголовка указать ключевое слово virtualс последующей ;. Для переопределения виртуального метода следует использовать ключевое слово override:
type
Base = class
public
procedurePrint; virtual;
begin
writeln('Base');
end;
end;
Derived = class(Base)
public
procedurePrint; override;
begin
writeln('Derived');
end;
end;
Теперь в аналогичном участке кода.
varb: Base := new Derived;
b.Print;
вызывается метод Print класса Derived за счет того что решение о вызове метода откладывается на этап выполнения программы.
Говорят, что методы Print завязаны в цепочку виртуальности . Чтобы разорвать ее (не вызывать методы в подклассах виртуально) используется ключевое слово reintroduce:
type
DerivedTwice1 = class(Derived)
public
procedurePrint; reintroduce;
begin
writeln('DerivedTwice1');
end;
end;
Если мы хотим начать новую цепочку виртуальности, то следует использовать и virtualи reintroduce:
type
DerivedTwice2 = class(Derived)
public
procedurePrint; virtual; reintroduce;
begin
writeln('DerivedTwice2');
end;
end;
Если переопределить виртуальную функцию невиртуальной без ключевого слова reintroduce, то ошибки не произойдет - будет выведено лишь предупреждение о том, что цепочка виртуальности нарушена. Таким образом, ключевое слово reintroduceв этой ситуации лишь подавляет вывод предупреждения.
При переопределении виртуального метода в подклассе его уровень доступа должен быть не ниже, чем в базовом классе. Например, publicвиртуальный метод не может быть переопределен в подклассе private-методом.
Абстрактные методы
Методы, предназначенные для переопределения в подклассах, объявляются с ключевым словом abstractи называются абстрактными. Данные методы являются виртуальными, но ключевое слово virtualиспользовать не нужно. Например:
type
Shape = class
private
x,y: integer;
public
constructorCreate(xx,yy: integer);
begin
x := xx;
y := yy;
end;
procedureDraw; abstract;
end;
Классы, содержащие абстрактные методы, также называются абстрактными. Экземпляры этих классов создавать нельзя.
Классы с абстрактными методами используются как полуфабрикаты для создания других классов. Например:
type
Point = class(Shape)
public
procedureDraw; override;
begin
PitPixel(x,y,Color.Black);
end;
end;
Использование overrideпри переопределении абстрактных методов обязательно, поскольку абстрактные методы являются разновидностью виртуальных.
Перегрузка операций
Перегрузка операций - это средство языка, позволяющее вводить операции над типами, определяемыми пользователем. В PascalABC.NETможно использовать только предопределенные значки операций. Перегрузка операций для типа T, являющегося классом или записью, осуществляется при помощи статической (классовой) функции-метода со специальным именем operator ЗнакОперации . Перегрузка специальных операций +=, -=, *=, /= осуществляется с помощью статической (классовой) процедуры-метода, первый параметр которой передается по ссылке.
Например:
type
Complex = record
re,im: real;
class function operator+(a,b: Complex): Complex;
begin
Result.re := a.re + b.re;
Result.im := a.im + b.im;
end;
class function operator=(a,b: Complex): boolean;
begin
Result := (a.re = b.re) and(a.im = b.im);
end;
end;
Для перегрузки операций действуют следующие правила:
* Перегружать можно все операции за исключением @ (взятие адреса), as, is, new. Кроме того, можно перегружать специальные бинарные операции +=, -=, *=, /=, не возвращающие значений.
* Перегружать можно только еще не перегруженные операции.
* Тип по крайней мере одного операнда должен совпадать с типом класса или записи, внутри которого определена операция.
* Перегрузка осуществляется с помощью статической функции-метода, количество параметров которой совпадает с количеством параметров соответствующей операции (2 - для бинарной, 1 - для унарной).
Читать дальшеИнтервал:
Закладка: