Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2014, 18:57   #11
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Цитата:
Как создать объект реализующий IInterf2?
Обычно пишется метод-построитель экспортируемый (при желании можете фабрику запилить для всех вариантов)
Код:
function BuildInterf(): IInterf; // stdcall; export;
begin
  Result := TInterf.Create();
... // если нужны доп. настройки
end;
function BuildInterf2(): IInterf2; // stdcall; export;
begin
  Result := TInterf.Create(); 
// или BuildInterf() as TInterf2 , (ну или как там интерфейс кастануть, 
// была какая-то хитрость, as не канает, емнип) это на случай доп.настроек
end;
При создании ком-объекта дельфи даже сам генерирует эти методы-построители.
phomm вне форума Ответить с цитированием
Старый 15.06.2014, 11:37   #12
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Всем доброго времени суток!

Разрабатываю архитектуру ПО. Возник вопрос, допустим есть некий интерфейс IInterf, и объект TInterf реализующий его. Спустя некоторое время я расширяю интерфейс IInterf, создав IInterf2 с новыми методами и свойствами.

У меня 2 интерфейса(старый и новый) и всего 1 объект.
...
Правильно ли я делаю или нет?
Если коротко, то недостаточно данных для ответа. Возможно, в данном случае не требуется описывать новый интерфейс - допустимо расширение старого (если при этом не изменяется порядок следования методов и их сигнатуры, а только добавляются новые).
Полный и развёрнутый ответ мне кажется будет слишком большим. Я бы посоветовал устранить хаос в голове с помощью старенького, но отличного цикла статей - http://www.developing.ru/com/. Потом можно будет отвечать на вопросы более осмысленно =-)
StriderX вне форума Ответить с цитированием
Старый 16.06.2014, 10:13   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Код:
var
  i:IInterf;
  j:Iinterf2;
begin
  I:= TIntrf.Create;
  I.CallNewMethod(); //Здесь будет ошибка, CallNewMethod не объявлен в IInterf
  J := TInterf.Create;
  J.CallNewMethod(); //Здесь все хорошо, CallNewMethod объявлен в IInterf2
end;
здесь мы имеем ДВА разных объекта (два Create)


Код:
I:=TIntf.Create;//на самом деле это I:=Tintf.Create as IIntf;
J:=Tintf.Create;//                  J:=Tintf.Create as IIntf2;
ВСЕ интерфейсные объекты имеют один базовый интерфейс с помощью которого любой другой код может узнать о возможностях данного объекта (поддержке им других интерфейсов) IUnknown(все языки) IInterface(Delpi).
Цитата:
Код:
type
  IInterface = interface
    ['{00000000-0000-0000-C000-000000000046}']
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

  IUnknown = IInterface;
type
TInterfacedObject = class(TObject, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
...
end;

как "добыть" интерфейс IInterf2 для некоего объекта, если известен его другой интерфейс IInterf
Код:
I:=Tintf.Create;// создали объект и получили один из его интерфейсов IInterf
вар 1. получили использовали и сразу забыли
Код:
(I as IInterf2).CallNewMetod();если TIntf не реализует будет Exception
вар 2. получили и запомнили для дальнейшего использования
Код:
J:=I as IInterf2; 
J.CallNewMetod();
вар 3.получаем с проверкой а есть ли он
Код:
if I.QueryInterface(IInterf2, J)=s_OK then begin 
 J.CallNEwMetod();
end
else raise Exception.Create('объект не поддерживает новый IInterf2');
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 16.06.2014 в 10:26.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скорость одного объекта относительно другого Anton911 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 17.07.2012 03:18
Виртуальное наследование и автоматическое обнуление объекта coNsept Общие вопросы C/C++ 8 20.06.2012 15:14
Как передать управление из одного объекта в другой? wolf05632 Microsoft Office Word 16 10.04.2011 08:21
Использование одного объекта в двух потоках Anekdot Общие вопросы Delphi 0 16.03.2010 19:37
Перекрытие одного объекта другим Djem1991 Общие вопросы Delphi 3 11.06.2009 13:17