Программирование на Атлантисе (VIP, FCOM, ARD), FastReport
Модераторы: m0p3e , edward_K , Модераторы
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 16 фев 2009, 14:43
Есть такой объектный интерфейс, называется 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 » 17 фев 2009, 14:04
Для чего создавать новый objInterface - ObjMyStrFunc? Перекройте просто функцию ObjStrFunc::GetFio
Т.е.
Код: Выделить всё
VipInterface MyStringFunctions(StringFunctions);
public:
function ObjStrFunc.GetFIO(FIO : string) : string; // Здесь перекрытие
end;
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 17 фев 2009, 15:07
Ну да, в принципе, в моем этом конкретном примере объектный интерфейс не нужен. Но ведь это проблему все-равно не решит. Ошибка остается. У вас нет полного рабочего примера?
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 17 фев 2009, 15:21
Раскидал описание вип-интерфейса и реализацию интерфейса по разным файлам, в реализации проинклюдил вип-интерфейс. Ошибка, о которой писал выше, исчезла. Теперь вопрос, как обращаться к наследуемым, но не перекрываемым методам при реализации? Через Inherited не получается, пишет , что отсутствует базовый объект. Через имя интерфейса StringFunctions тоже не получается, так как методы не описаны как статические.
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 17 фев 2009, 15:54
а что просто вызвать внутри наследника метод родителя не прокатывает?
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 17 фев 2009, 15:58
нет, пишет, что нет такой функции
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 17 фев 2009, 16:11
А так:
ObjStrFunc(self).GetFio(...);?
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 17 фев 2009, 16:31
Код: Выделить всё
Ошибка: Нет такой функции, поля или метода : SELF
galover
Местный житель
Сообщения: 794 Зарегистрирован: 16 ноя 2007, 13:52
Сообщение
galover » 17 фев 2009, 16:51
указывали компонентную принадлежность?
Z_Staff::ObjStrFunc(self).GetFio(...);
Vik
Местный житель
Сообщения: 370 Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:
Сообщение
Vik » 17 фев 2009, 19:54
Вот простейший, не имеющий смысла код, сделанный так как вы советовали:
Код: Выделить всё
#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 » 19 фев 2009, 11:10
У меня на 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 » 19 фев 2009, 13:17
На 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 » 19 фев 2009, 17:57
Screw писал(а): и содержимое StrFunc.vih в точности соответствует тому, с которым собирался этот ресурс.
Я изначально и грешил на то, что у меня StrFunc.vih не тот. Прислали другой StrFunc.vih, все откомпиллировалось. Спасибо, за помощь!