TMyObject = class(TObject);
±i4yObject = class;

Первый вариант, хотя он и более длинный, предпочтительнее - для устранения возможных неоднозначностей. Класс TObject несет очень серьезную нагрузку и будет рассмотрен отдельно.

Унаследованные от класса-предка поля и методы доступны в дочернем классе; если имеет место совпадение имен методов, то говорят, что они перекрываются.

Поведение методов при наследовании, без преувеличения, является краеугольным камнем объектно-ориентированного программирования. В зависимости от того, какие действия происходят при вызове, методы делятся на три группы. В первую группу отнесем статические методы, во вторую - виртуальные (virtual) и динамические (dynamic) и, наконец, в третью - появившиеся только в Delphi 4 - перегружаемые (overload) методы.

Методы первой группы полностью перекрываются в классах-потомках при их переопределении. При этом можно полностью изменить объявление метода. Методы второй группы при наследовании должны сохранять наименование и тип. Перегружаемые методы дополняют механизм наследования возможностью использовать нужный вариант метода (собственный или родительский) в зависимости от условий применения. Подробно все эти методы обсуждаются ниже.

Язык С++ допускает так называемое множественное наследование. В этом случае новый класс может наследовать часть своих элементов от одного родительского класса, а часть - от другого. Это, наряду с удобствами, зачастую приводит к проблемам. В Object Pascal понятие множественного наследования отсутствует. Если вы хотите, чтобы новый класс объединял свойства нескольких, породите классы-предки один от другого или включите в один класс несколько полей, соответствующих другим желаемым классам.

Полиморфизм

Рассмотрим внимательно следующий пример. Пусть у нас имеются некое обобщенное поле для хранения данных - класс TField и три его потомка - для хранения строк, целых и вещественных чисел:

type TField = class

function GetData:string;
virtual;
abstract,-end;

TStringField = class(TField)

FData : string;
function GetData: string;
override;
end;

TIntegerField = class(TField)

FData : Integer;
function GetData: string;override;
end;

TExtendedField = class(TField)

FData : Extended;
function GetData: string;override;
end;
function TStringField.GetData;
begin
Result := FData;
end;
function TIntegerField.GetData;
begin
Result := IntToStr(FData);
end;
function TBxtendedField.GetData;
begin
Result:= FloatToStrF(FData, ffFixed, 7, 2);
end;
procedure ShowData(AField : TField) ;
begin
Forml.Labell.Caption := AField.GetData;
end;

В этом примере классы содержат разнотипные поля данных FData и только-то и "умеют", что сообщить о значении этих данных текстовой строкой (при ПОМОЩИ метода GetData). Внешняя ПО ОтаОШеНИЮ К НИМ Процедура ShowData получает объект в виде параметра и показывает эту строку.

Правила контроля соответствия типов (typecasting) языка Object Pascal гласят, что объекту как указателю на экземпляр объектного типа может быть присвоен адрес любого экземпляра любого из дочерних типов. В процедуре showData параметр описан как TField - это значит, что в нее можно передавать объекты классов И TStringField, И TintegerField, И TExtendedField, И любого другого потомка класса TFieid.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Август
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс