Вход/Регистрация
Технологии программирования
вернуться

Костерин В В

Шрифт:

TMyObject = class(TObject);

TMyObject = class;

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

Приведем объявление базового для всех объектных типов класса TObject:

TObject = class

constructor Create;

destructor Destroy; virtual;

procedure Free;

class function Newlnstance: TObject; virtual;

procedure Freelnstance; virtual;

class procedure Initlnstance(Instance: Pointer):

TObject;

function ClassType: TClass;

class function ClassName: string;

class function ClassParent: TClass;

class function ClassInfo: Pointer;

class function InstanceSize: Word;

class function InheritsFrom(AClass: TClass):

Boolean;

procedure DefaultHandler(var Message); virtual;

procedure Dispatch(var Message);

class function MethodAddress(const Name: string):

Pointer;

class function MethodName(Address: Pointer):

string;

function FieldAddress(const Name: string):

Pointer;

end;

Такая архитектура возможна только при наличии механизма поддержки информации о типах — RTTI (RunTime Type Information). Основой такого механизма является внутренняя структура классов и, в частности, возможность доступа к ней за счет использования методов классов, описываемых конструкцией class function…

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

По тому, какие действия происходят при вызове, методы делятся на группы:

• статические (static);

• виртуальные (virtual);

• динамические (dynamic);

• абстрактные (abstract).

Статические методы, а также поля в объектах-потомках ведут себя одинаково: можно без ограничений перекрывать старые имена и при этом изменять тип методов:

type

T1stObj = class

I: Real;

procedure SetData(Avalue: Real);

end;

T2ndObj = class(T1stObj)

I: Integer;

procedure SetData(Avalue: Integer);

end;

…

procedure T1stObj.SetData;

begin

i: = v;

end;

procedure T2nd0bj.SetData;

begin

i:= 0;

inherited SetData(0.99);

end;

В этом примере разные методы с именем SetData присваивают значения разным полям с именем i. Перекрытое поле предка недоступно в потомке. В отличие от поля внутри других методов перекрытый метод доступен при указании зарезервированного слова inherited. Методы объектов по умолчанию являются статическими — их адрес определяется еще на стадии компиляции проекта. Они вызываются быстрее всего.

Язык C++ позволяет так называемое множественное наследование. В этом случае новый класс может наследовать часть своих элементов от одного родительского класса, а часть — от другого, это наряду с удобствами зачастую приводит к проблемам.

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

  • Читать дальше
  • 1
  • ...
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: