Страница 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, все откомпиллировалось. Спасибо, за помощь!