Страница 1 из 1
Наследование vip-интерфейсов.
Добавлено: 16 фев 2009, 14:43
Vik
Есть такой объектный интерфейс, называется ObjStrFunc и описан в StrFunc.vih. Его имплементирует вип-интерфейс StringFunctions. Как можно правильно описать свой вип-интерфейс, наследующий StringFunctions и имплементирующий какой-то другой объектный интерфейс?
Я попробовал в таком духе:
Код: Выделить всё
#include StrFunc.vih
ObjInterface ObjMyStrFunc;
function GetFIO(FIO : string) : string;
end;
VipInterface MyStringFunctions(StringFunctions) implements ObjMyStrFunc;
public:
function ObjStrFunc.GetFIO(FIO : string) : string;
end;
interface MyStringFunctions;
Function GetFio(FIO : string) : string;
{
if (Inherited::GetLastName(FIO) like '_._.') and (Trim(Inherited::GetPatronymic(FIO)) = '') {
Result := FIO
Exit;
}
Result := if (Trim(Inherited::GetFIO(FIO)) ='..','',Inherited::GetFIO(FIO))
}
end.
В итоге при компилляции получаю ошибку:
Код: Выделить всё
Ошибка: Не совпадает структура родительского интерфейса StringFunctions с описанием
Что я не так делаю?
Добавлено: 17 фев 2009, 14:04
galover
Для чего создавать новый objInterface - ObjMyStrFunc? Перекройте просто функцию ObjStrFunc::GetFio
Т.е.
Код: Выделить всё
VipInterface MyStringFunctions(StringFunctions);
public:
function ObjStrFunc.GetFIO(FIO : string) : string; // Здесь перекрытие
end;
Добавлено: 17 фев 2009, 15:07
Vik
Ну да, в принципе, в моем этом конкретном примере объектный интерфейс не нужен. Но ведь это проблему все-равно не решит. Ошибка остается. У вас нет полного рабочего примера?
Добавлено: 17 фев 2009, 15:21
Vik
Раскидал описание вип-интерфейса и реализацию интерфейса по разным файлам, в реализации проинклюдил вип-интерфейс. Ошибка, о которой писал выше, исчезла. Теперь вопрос, как обращаться к наследуемым, но не перекрываемым методам при реализации? Через Inherited не получается, пишет , что отсутствует базовый объект. Через имя интерфейса StringFunctions тоже не получается, так как методы не описаны как статические.
Добавлено: 17 фев 2009, 15:54
galover
а что просто вызвать внутри наследника метод родителя не прокатывает?
Добавлено: 17 фев 2009, 15:58
Vik
нет, пишет, что нет такой функции
Добавлено: 17 фев 2009, 16:11
galover
А так:
ObjStrFunc(self).GetFio(...);?
Добавлено: 17 фев 2009, 16:31
Vik
Код: Выделить всё
Ошибка: Нет такой функции, поля или метода : SELF

Добавлено: 17 фев 2009, 16:51
galover
указывали компонентную принадлежность?
Z_Staff::ObjStrFunc(self).GetFio(...);
Добавлено: 17 фев 2009, 19:54
Vik
Вот простейший, не имеющий смысла код, сделанный так как вы советовали:
Код: Выделить всё
#include ExStrFunc.vih
interface _ExStringFunctions;
Function GetFio(FIO : string) : string;
{
Result := Z_Staff::ObjStrFunc(self).GetFio(FIO);
}
Содержимое ExStrFunc.vih :
Код: Выделить всё
#ifndef _ExStrFunc_vih_
#define _ExStrFunc_vih_
#component "z_staff"
#include StrFunc.vih
VipInterface _ExStringFunctions(StringFunctions);
public:
function ObjStrFunc.GetFIO(FIO : string) : string;
end;
#endif
Ругается на SELF. Эх.. Атлантис у меня 5.4.14
Добавлено: 19 фев 2009, 11:10
galover
У меня на 5.3.21 вообще не компилируется все что связано с наследованием (5.4 пока не ставил). Так что проверить не могу. Упростите свой пример и проверьте будет ли компилироваться
Код: Выделить всё
//-------------- Vih file ---------------------
#ifndef _ExStrFunc_vih_
#define _ExStrFunc_vih_
#include StrFunc.vih
#component "z_staff"
VipInterface _ExStringFunctions(StringFunctions);
public:
function TestFunc(FIO : string) : string;
end;
#endif
//--------------------- Vip file ---------------------
#include ExStrFunc.vih
#include StrFunc.vih
#component "z_staff"
interface _ExStringFunctions;
public function TestFunc(FIO : string) : string;
{
result := ObjStrFunc(self).GetFio(FIO);
}
Добавлено: 19 фев 2009, 13:17
Screw
На 5.4 нижеприведенный пример компилится без проблем при условии, что при сборке подключается z_staff.res, и содержимое StrFunc.vih в точности соответствует тому, с которым собирался этот ресурс. Выполнение обоих условий обязательно для нормальной сборки.
Код: Выделить всё
#include StrFunc.vih
VipInterface MyStringFunctions(StringFunctions);
public:
function ObjStrFunc.GetFIO(FIO : string): string;
end;
interface MyStringFunctions;
Function GetFio(FIO : string) : string;
{
if (Inherited::GetLastName(FIO) like '_._.') and (Trim(Inherited::GetPatronymic(FIO)) = '') {
Result := FIO;
Exit;
}
Result := if (Trim(Inherited::GetFIO(FIO)) ='..', '', Inherited::GetFIO(FIO))
}
end.
Добавлено: 19 фев 2009, 17:57
Vik
Screw писал(а):и содержимое StrFunc.vih в точности соответствует тому, с которым собирался этот ресурс.
Я изначально и грешил на то, что у меня StrFunc.vih не тот. Прислали другой StrFunc.vih, все откомпиллировалось. Спасибо, за помощь!