
- •5. Объекты и их жизненный цикл. Создание и уничтожение объектов. Алгоритм реализации в .Net освобождения памяти.
- •6. Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
- •8. Инкапсуляция. Скрытие членов класса.
- •15. Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
- •16. Виртуальные методы. Функциональное назначение. Примеры применения.
- •17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
- •18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.
- •Вопрос 19.
- •Вопрос 20
- •Вопрос 21
17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
Перегрузка операций - это средство языка, позволяющее вводить операции над типами, определяемыми пользователем. В 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 - для унарной).
Перегрузка операций +=, -=, *=, /= осуществляется с помощью статической процедуры-метода, первый параметр которой передается по ссылке и имеет тип записи или класса, в котором определяется данная операция, второй - передается по значению и совместим по присваиванию с первым. Перегрузка остальных операций осуществляется с помощью статических функций-методов, параметры которых должны передаваться по значению.
Типы интерфейсов не могут быть типами параметров. Причина: типы параметров должны вычисляться на этапе компиляции.
Операции приведения типа задаются статическими функциями, у которых вместо имени используется operator implicit (для неявного приведения типа) или operator explicit (для явного приведения типа).
Например:
type Complex = record ... class function operator implicit(d: real): Complex; begin Result.re := d; Result.im := 0; end; class function operator explicit(c: Complex): string; begin Result := Format('({0},{1})',c.re,c.im); end; class procedure operator+=(var c: Complex; value: Complex); begin c.re += value.re; c.im += value.im; end; end;
18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.
Область видимости членов класса (то есть область кода, из которой к ним можно обращаться по неквалифицированному имени — без указания имени класса или объекта) не зависит от их области доступа, и всегда совпадает с кодом методов класса.
Члены класса видны (то есть к ним можно обращаться без указании имени класса) исключительно в методах
область же видимости самого класса зависит от пространства имён.
Теперь кратко, кому какой доступ они предоставляют
1.Public – доступ открыт всем, кто видит определение данного класса.
2.Private – доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
3.Protected – доступ открыт классам, производным от данного.
Досупны следующие типы видимости членов:
@private - член доступен только внутри класса;
@protected - член доступен внутри класса и в его потомках;
@public - член доступен всем;
@package - анлогично @public внутри исполняемого образа, и как @private при доступе из вне;
@interface Worker : NSObject
{
char *name;
@private
char *evaluation;
@protected
id job;
float wage;
@public
id boss;
int age;
}
Соответственно
Worker * worker = [[Worker alloc] init];
worker->age = 30; // разрешено
// worker->wage = 60.23; // ошибка на стадии компиляции