Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
классы_лекция.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
111.62 Кб
Скачать

Одноименные методы

В Delphi можно в рамках одного класса объявлять несколько одно­именных методов. Механизм перекрытия родительского метода одноименным методом потомка приводит к тому, что потомок «не видит» пере­крытый родительский метод и может обращаться к нему лишь с помощью зарезер­вированного слова Inherited.

В Delphi введено зарезервированное слово over­load (перезагрузить), с помощью которого становятся видны одноименные методы, как родителя, так и потомка. Чтобы одноименные методы можно было отличить друг от друга, каждый из них должен иметь уникальный набор параметров.

В ходе выполнения программы при обращении к одному из одноименных методов программа проверяет тип и количество фактических параметров обращения и выбирает нужный метод.

При обнаружении одноименного метода компилятор 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. Вообще говоря, свойство может и не связываться с полем. Фактически оно описывает один или два метода, которые осуществляют некоторые действия над данными того же типа, что и свойство.