Наследование

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

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

Ответить
lukdom
Сообщения: 4
Зарегистрирован: 08 авг 2013, 04:22

Наследование

Сообщение lukdom »

Добрый день. Может кто сталкивался с такой проблемой или знает как ее решить:

Делаю интерфейс, имплиментурую объектную процедуру. Потом делаю другой интерфейс, наследуемый от первого. И хочу заместить процедуру. При компиляции выдает ошибку " Повторная реализация метода"

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

ObjInterface ObjInter;
  procedure doSome(pRec : comp);
End;

Interface iInt1;
procedure doSome(pRec : comp);
{
   message('iInt1.doSome');
}
end.

VipInterface iInt1 implements ObjInter licensed( free );

Interface iInt2;
procedure doSome(pRec : comp);
{
   message('iInt2.doSome');  // здесь возникает ошибка "Повторная реализация метода ObjInter.doSome"
}
end.

VipInterface iInt2(iInt1) licensed( free );
Все это нужно для того, что бы по объектной переменной вызвать нужную процедуру на подобии такого

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

 var oM : ObjInter;
 
 if (Trim(sInt) = '')
    {
      if NullVipRef(oM)
        LoadVipRef(oM, 'iInt1');
    }
  else
    if NullVipRef(oM)
      LoadVipRef(oM, 'iInt2');

  oM.doSome(pDogovor);
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Наследование

Сообщение Den »

" Когда есть желание перекрыть реализацию унаследованной функции, в описании интерфейса нужно описать перекрываемую функцию" (с)
Видимо, ее для VipInterface iInt2 нужно объявить как Public.
lukdom
Сообщения: 4
Зарегистрирован: 08 авг 2013, 04:22

Re: Наследование

Сообщение lukdom »

Den писал(а):Видимо, ее для VipInterface iInt2 нужно объявить как Public.
Уже так делал. Делал и по другому описывал ее и в iInt1 а так же вместе в iInt1 и iInt2 все равно возникала одна и тажа ошибка
Ошибка: метод doSome есть у нескольких объектных интерфейсов.

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

VipInterface iInt2(iInt1) licensed( free );
public :
    procedure doSome(pRec : comp);
end;
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Наследование

Сообщение Den »

мутновато как то все...но получилось собрать только без описания явно ObjInterface

т.е. 1.vih :

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

VipInterface iInt1 sourceFile="v0.vip" licensed( free );
 Public :
  procedure doSome(pRec : comp);
 End;
2.vih :

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

VipInterface iInt2(iInt1)  licensed( free );
 Public :
  procedure doSome(pRec : comp);
end;
0.vip

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

Interface iInt1;
procedure doSome(pRec : comp);
{
   message('iInt1.doSome');
}

end.
1.vip

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

Interface iInt2;
public procedure doSome(pRec : comp);
{
   message('iInt2.doSome');  // здесь возникает ошибка "Повторная реализация метода ObjInter.doSome"
}
end.
ну и в файле проекта

#include 1.vih
#include 2.vih

#make "0.vip"
#make "1.vip"
#make "2.vip" // вызов "извне" метода doSome Interface iInt2

а 2.vip :

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

Interface testcall;

 create view
  ;

  var li1 : iInt2 ;

  HandleEvent
   CmInit:{
            LoadVipInterface (li1);
            li1.doSome(0);
          }
  end;
end.
lukdom
Сообщения: 4
Зарегистрирован: 08 авг 2013, 04:22

Re: Наследование

Сообщение lukdom »

Den писал(а):мутновато как то все...но получилось собрать только без описания явно ObjInterface
Да так будет работать, но не совсем то что мне нужно.
Тут получаются интерфейсные переменные. Я чутка не так написал для упрощения вопроса, но суть в том что бы в объектную переменную загружать динамически ссылку на интерфейс:

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

procedure run(sInt : string);
{
  var oM : ObjInter;

  if (Trim(sInt) = '')
    {
      if NullVipRef(oM)
        LoadVipRef(oM, 'iInt1');
    }
  else
    if NullVipRef(oM)
      LoadVipRef(oM, sInt);

  oM.doSome(pDogovor);
}
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Наследование

Сообщение Den »

тогда так как у Вас +

VipInterface iInt2(iInt1) licensed( free );
Public:
Procedure ObjInter.DoSome(pRec : comp);
end;

цитату верно указал я. но правильно вот так нужно.
lukdom
Сообщения: 4
Зарегистрирован: 08 авг 2013, 04:22

Re: Наследование

Сообщение lukdom »

Den писал(а):Procedure ObjInter.DoSome(pRec : comp);
:cool:
То что нужно. Большое спасибо!
Ответить