Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
50
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

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

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

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

При обнаружении одноименного метода компилятор Delphi предупреж­дает о том, что у класса уже есть аналогичный метод с другими пара­метрами. Для подавления сообщений объявление одноименного метода можно сопровождать зарезервированным словом reintroduce (вновь ввести).

В следующем примере в классе TForm1 используются целых четыре одноименных метода Close. Лишь один из них - унаследованный метод без параметра выполняет свои основные функции - закрывает окно. Три других отличаются набором параметров и выводят сообщение в заголо­вок окна.

Поместите на пустую форму четыре кнопки TButton и напишите та­кие обработчики их событий OnClick:

procedure TForml.ButtonlClick (Sender : TObject);

begin

Close('Строка символов')

end;

procedure TForml.Button2Click(Sender: TObject);

begin

Close(123)

end;

procedure TForml.Button3Click(Sender: TObject);

begin

Close(20,300);

end;

procedure TForml.Button4Click(Sender: TObject);

begin

Close

end;

Теперь в раздел private класса TForml вставьте три таких объявле­ния методов Close:

private

{ Private declarations }

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 класса TForml и менять заголовок окна, в то время как кнопка Button4 обратится к методу Close родительского класса TForm и закроет окно.

Свойства

Свойства - это специальный механизм классов, регулирующий дос­туп к полям. Свойства объявляются с помощью зарезервированных слов property, read и write (слова 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;

…..

aClass.Destroy; // Удаление ненужного объекта

end;

Более того, возможен и такой оператор присваивания:

aClass.IntField := NewValue;

Разница между этим оператором и оператором

aClass.IntegerValue := NewValue;

заключается в том, что при обращении к свойству автоматически под­ключается метод SetField, в котором могут реализовываться специфич­ные действия. Нпример, при выполнении оператора

lbOutput.Caption := 'Строка';

свойство Caption компонента Label вызывает метод SetText, который не только запоминает строку символов во внутренней переменной, но и осуществляет прорисовку метки с новым текстом.

Если нет необходимости в специальных действиях при чтении или записи свойства, вместо имени соответствующего метода можно указы­вать имя поля:

type

TaClass = class

IntFiled: Integer;

Procedure SetField(Value: Integer);

Property IntegerValue: Integer read IntFiled write SetField;

end;

Если необходимо, чтобы поле было доступно только для чтения или только для записи, следует опустить соответственно часть write или read. Вообще говоря, свойство может и не связываться с полем. Фактиче­ски оно описывает один или два метода, которые осуществляют некото­рые действия над данными того же типа, что и свойство.

Соседние файлы в папке ООП