
Одноименные методы
В Delphi можно в рамках одного класса объявлять несколько одноименных методов. Механизм перекрытия родительского метода одноименным методом потомка приводит к тому, что потомок «не видит» перекрытый родительский метод и может обращаться к нему лишь с помощью зарезервированного слова Inherited.
В Delphi введено зарезервированное слово overload (перезагрузить), с помощью которого становятся видны одноименные методы, как родителя, так и потомка. Чтобы одноименные методы можно было отличить друг от друга, каждый из них должен иметь уникальный набор параметров.
В ходе выполнения программы при обращении к одному из одноименных методов программа проверяет тип и количество фактических параметров обращения и выбирает нужный метод.
При обнаружении одноименного метода компилятор Delphi предупреждает о том, что у класса уже есть аналогичный метод с другими параметрами. Для подавления сообщений объявление одноименного метода можно сопровождать зарезервированным словом reintroduce (вновь ввести).
Например, поместим на пустую форму четыре кнопки TButton и напишем для них такие обработчики их событий OnClick:
procedure TForml.Button1Click(Sender: TObject);
begin
Close( 'Строка символов')
end;
procedure TForml.Button2Click(Sender: TObject);
begin
Close(123)
end;
procedure TForml.Button3Click(Sender: TObject);
begin
Сlоsе(20,300);
end;
procedure TForml.Button4Click(Sender: TObject);
begin
Close
end;
Теперь в раздел private класса TForm1 вставим три объявления методов Close:
private
{ Private declaratioпs }
procedure Close(S: String); reintroduce; overload;
procedure Close(I: Integer); reintroduce; overload;
procedure Close(I,J: Integer); reintroduce; overload;
И, наконец, в разделе implementation поместим описания объявленных методов:
procedure TForml.Close(S: String);
begin
Caption := S
end;
procedure TForml.Close(I: Integer);
begin
Caption := IntToStr(I)
end;
procedure TForml.close(I,J: Integer);
begin
Caption := IntToStr(i*j)
end;
Теперь после запуска программы три первые кнопки будут вызывать методы Close класса TForm1 и менять заголовок окна, в то время как кнопка Button4 обратится к методу Close родительского класса TForm и закроет окно.
Свойства
Свойства - это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write. Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Например:
type
TaClass = class
IntField: Integer;
Function GetField: Integer;
Procedure SetField(Value: Integer);
Property IntegerValue: Integer read GetField write SetField;
end;
В контексте программы свойство ведет себя как обычное поле. Например, можно написать такие операторы:
var
aClass: TaClass;
Value: Integer;
begin
aClass := TaClass.Create; //Обязательное обращение к конструктору перед
aClass.IntegerValue := 0;
...
Value := aClass.IntegerValue;
...
FreeAndNil(aClass); // Удаление ненужного объекта
end;
Возможен и такой оператор присваивания: аClass.IntField := NewValue;
Разница между этими операторами заключается в том, что при обращении к свойству автоматически подключается метод SetField,в котором могут реализовываться специфичные действия.
Так, например, в использовавшимся нами операторе:
LbOutput.Caption := ‘Строка’;
Свойство Caption компонента Lаbеl вызывает метод SetText, который не только запоминает строку символов во внутренней переменной, но и осуществляет прорисовку метки с новым текстом.
Если нет необходимости в специальных действиях при чтении или записи свойства, вместо имени соответствующего метода можно указывать имя поля:
tуре
ТаСIаss = сlass
IntFiled : Integer;
Procedure SetField(Value: Integer);
Property IntegerValue: Integer read IntFiled write SetField;
end;
Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно часть write или read. Вообще говоря, свойство может и не связываться с полем. Фактически оно описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойство.