Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.doc
Скачиваний:
17
Добавлен:
25.12.2018
Размер:
683.01 Кб
Скачать

6.6. Команда Index

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

Примечания:

Эта команда указывается первой в списке команд объявления свойств.

Методы доступа к свойству, имеющему раздел Index должны иметь дополнительный параметр, объявленный как Integer. Для метода чтения этот параметр должен быть последним в списке параметров функции, а для метода записи этот параметр должен быть предпоследним в списке параметров процедуры - предшествовать параметру, определяющему зна­чение свойства.

Примером может служить приведенный в справочной системе Delphi класс TSampleCalendar.

Type

TSampleCalendar=CIass(TCustomGrid) Private

Function GetDateElement(Index: Integer): Integer;

Procedure SetDateElement(Index: Integer; Value: Integer);

Public

Property Day: Integer Index 3 Read GetDateElement Write SetDateElement;

Property Month: Integer Index 2 Read GetDateElement Write SetDateElement;

Property Year: Integer Index 1 Read GetDateElement Write SetDateElement;

End;

Function TSampleCalendar.GetDateElement(Index: Integer): Integer;

Var aYear, aMonth, aDay: Word;

Begin

DecodeDate(FDate, AYear, AMonth, ADay); // Декодер даты

Case Index Of // Выбор индекса

1: Result:=AYear;

2: Result:=AMonth;

3: Result:=ADay;

Else Result:=-l;

End;

End;

Procedure TSampleCaIendar.SetDateElement(Index: Integer; Value: Integer);

Var aYear, aMonth, aDay: Word;

Begin

If Value > 0 Then Begin

DecodeDate(FDate, AYear, AMonth, ADay); // Декодер даты

Case Index Of // Выбор индекса

1: AYear;=Value;

2: AMonth:=Value;

3: ADay:=Value;

Else Exit;

End;

FDate:=EncodeDate(AYear, AMonth, ADay); // Кодер даты

Refresh;

End;

End;

6.7. Команды DispId и Implements

а) Команда DispID используется для присвоения свойству значения Dispatch ГО, которое применяется в автоматизации OLE. Это целочисленное значение обычно используется при объявлении свойств Dispatch интерфей­сов. Эта команда может быть указана только у свойства, объявляемого в раз­деле Automated класса. Более подробно эта команда будет рассмотрена в гла­ве, посвященной интерфейсам.

б) Команда Implements используется при делегировании полномочий интерфейсов свойству класса. Применяется для реализации классов поддер­живающих интерфейсы и будет рассмотрена позднее во второй части посо­бия в главе, посвященной интерфейсам.

6.8. Переопределение свойств при наследовании

При наследовании свойств можно в классе-потомке заменить унаследо­ванную или добавить отсутствующую команду, изменить видимость и даже

повторно объявить свойство.

а) Для изменения области видимости необходимо в классе-потомке объ­явить имя свойства без указания типа и команд в разделе с большей видимо­стью, обычно в Public или Published, т.е. в сторону увеличения видимости.

Public Property MyProperty;

б) Для изменения или добавления команды следует объявить свойство без указания типа с дополнительной и/или измененной командой (Read] Write|Stored|Default|NoDefault). Одновременно можно изменить и область ви­димости.

в) Для повторного объявления свойства следует указать имя свойства вместе с новым типом. Обязательно должна быть хотя бы одна команда дос­тупа (Read|Write). При переопределении свойства можно вместо старых мето­дов доступа объявить и использовать новые.

Отметим, что переопределение не запрещает доступ к исходному свой­ству. Путем приведения типов можно обратиться к свойству предка или по­томка. При этом будут вызваны методы доступа свойства того класса, объект которого указывается при приведении типов. Таким образом, полиморфизм при доступе к свойству не наблюдается.

Объявим два класса, включающих свойства и методы доступа. При этом во втором классе свойство переопределим заново, изменив одновременно и тип свойства и методы доступа.

Type

TlstClass=Class // Первый класс

FFId: Integer; // Поле целого типа

Function Getint: Integer; // Метод чтения

Procedure Setlnt(lnt: Integer); // Метод записи

Property Prop: Integer Read Getint Write Setint; // Свойство целого типа

End;

T2ndClass=Class(TlstClass) II Второй класс

Function GetStr: String; II Метод чтения

Procedure SetStr(St: String); II Метод записи

Property Prop: String Read GetStr Write SetStr; // Свойство строкового типа

End;

Var Objl: TIstClass; II Переменная первого класса

Obj2: TZndClass; // Переменная второго класса

После объявления реализации указанных методов и инициализации эк­земпляров указанных классов и допустимы следующие операторы:

Procedure TForml.ButtonlClick(Sender: TObject);

Begin

Editl.Text:=IntToStr(Objl.Prop); II Доступ к свойству 1-го объекта Edit2.Text:=T2ndClass(Obj l).Prop; II Доступ к свойству 1-го объекта

End;

Procedure TFonnl.Button2Click(Sender: TObject);

Begin

Edit3.Text:=Obj2.Prop; II Доступ к свойству 2-го объекта Edit4.Text:=IntToStr(TlstClass(Obj2).Prop); // К свойству 2-го объекта

End;

Procedure TForinl.Button3Click(Sender: TObject);

Begin

Edit5.Text:=T2ndClass(Objl).Prop; II Доступ к свойству 1-го объекта

End;

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

г) Команда Implements позволяет для наследованных свойств добавить список интерфейсов, не меняя других характеристик свойства.