Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Когда класс реализует два или более интерфейсов, имеющих методы с одинаковыми именами, для разрешения конфликта имен используют выражения различения методов в виде “мэппинга”:
procedure interface.interfaceMethod = implementingMethod;
или
function interface.interfaceMethod = implementingMethod;
где implementingMethod — это метод, определенный в классе, или одном из его прародителей. Он может быть методом, описанном далее в описании класса, но не может быть “private” методом класса или одного из его прародителей, описанном в другом модуле. Пример:
type
TMemoryManager = class(TInterfacedObject, IMalloc, IErrorInfo)
function IMalloc.Alloc = Allocate;
procedure IMalloc.Free = Deallocate;
...
end;
Выражения различения методов не могут использовать мэппинг, имеющийся в классах-прародителях.
В спецификации интерфейса может быть описан уникальный глобальный идентификатор — globally unique identifier (GUID), представленный в виде строки литералов, заключенной в скобки:
['{xxxxxxxx–xxxx–xxxx–xxxx–xxxxxxxxxxxx}']
где каждый X это 16-ричная цифра (от 0 до F). GUID — это 16-байтовое двоичное число, уникально идентифицирующее интерфейс.
Если у интерфейса есть GUID, можно его использовать для запросов к переменной интерфейса, получить ссылки на его реализации. Типы tGUID и pGUID, определенные в модуле System, используются для работы с переменными типа GUID и указателями на такие переменные. Их описание следующее:
type
pGUID = ^tGUID;
tGUID =
record
D1: Longword;
D2: Word;
D3: Word;
D4: array[0..7] of Byte;
end;
Можно описать типизированную константу типа TGUID, например, имеющую имя IID -IMalloc:
const IID_IMalloc: TGUID = '{00000002-0000-0000-C000-000000000046}';
Вызов в процедуре переменной типа GUID аналогичен соответствующему типу interfase. Может быть использовано как значение, так и постоянный параметр типа TGUID. Например:
function Supports(Unknown: IUnknown; const IID: TGUID): Boolean;
Таким образом, вызов Supports может быть сделан одним из двух путей:
if Supports(Allocator, IMalloc) then...
или
if Supports(Allocator, IID_IMalloc) then...
Дата публикования: 2014-11-29; Прочитано: 208 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!