Наследование vip-интерфейсов.

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Наследование vip-интерфейсов.

Сообщение 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 с описанием
Что я не так делаю?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Для чего создавать новый objInterface - ObjMyStrFunc? Перекройте просто функцию ObjStrFunc::GetFio

Т.е.

Код: Выделить всё

VipInterface MyStringFunctions(StringFunctions);
public:
   function ObjStrFunc.GetFIO(FIO : string) : string; // Здесь перекрытие
end;
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Ну да, в принципе, в моем этом конкретном примере объектный интерфейс не нужен. Но ведь это проблему все-равно не решит. Ошибка остается. У вас нет полного рабочего примера?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Раскидал описание вип-интерфейса и реализацию интерфейса по разным файлам, в реализации проинклюдил вип-интерфейс. Ошибка, о которой писал выше, исчезла. Теперь вопрос, как обращаться к наследуемым, но не перекрываемым методам при реализации? Через Inherited не получается, пишет , что отсутствует базовый объект. Через имя интерфейса StringFunctions тоже не получается, так как методы не описаны как статические.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

а что просто вызвать внутри наследника метод родителя не прокатывает?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

нет, пишет, что нет такой функции
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

А так:
ObjStrFunc(self).GetFio(...);?
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Код: Выделить всё

Ошибка: Нет такой функции, поля или метода : SELF
:(
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

указывали компонентную принадлежность?
Z_Staff::ObjStrFunc(self).GetFio(...);
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение 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
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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);
} 
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение 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.

Виталий
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Screw писал(а):и содержимое StrFunc.vih в точности соответствует тому, с которым собирался этот ресурс.
Я изначально и грешил на то, что у меня StrFunc.vih не тот. Прислали другой StrFunc.vih, все откомпиллировалось. Спасибо, за помощь!
Ответить