Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Множественное наследование интерфейсов, как в JVCL


Автор: ZVano 25.5.2011, 17:58
Пробую сотворить движек приложения с плагинами по аналогии с реализацией в https://jvcl.svn.sourceforge.net/svnroot/jvcl/trunk ориентируясь на пример из vcl\examples\JvPlugin\6PluginPackage\
В Delphi нет множественного наследования классов, но есть наследование Один класс - множество интерфейсов.
В С++ нет понятия интерфейсов, есть множественное наследование классов, но его нельзя выполнять для классов VCL.

Как в С++ реализовать следующий финт ушами от Delphi?
Код Delphi:
Код

//JvPlgIntf.inc
unit JvPlgIntf;

// holding interfaces for plugins and main application
// remember to always produce unique GUIDs (Ctrl+Shift+G) - never reuse them after changes

interface

uses
  Windows, Classes;

// A common interface for all plugins
type
  IMyMainAppInterface = interface;
  IMyPluginInterface = interface
    ['{A7F68489-2B52-4E59-B5E8-2044C7F67C09}']

    procedure ShowPlug(Sender: TObject);
    // provide a means for the app to make itself known to the plugin
    procedure Init(const MainApp:IMyMainAppInterface);
    // ...
  end;


  // if plugins shall be able to access the mainapplication,
  //   an interface for the main application should be defined as well
  IMyMainAppInterface = interface

    ['{00D251C6-8D61-43F7-88F8-35F7F7EC364D}']
    procedure DoSomethingSpecial(Name: string; OnClick: TNotifyEvent);

    // this way properties can be used:
     function GetPosition : TPoint;
     procedure SetPosition(const NewPos : TPoint);
     property Position : TPoint read GetPosition write SetPosition;
  end;


implementation

end.


// ufrmMain.pas
unit ufrmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, JvPluginManager, ExtCtrls, JvComponent, JvPlgIntf;

type
  TfrmMain = class(TForm, IUnknown, IMyMainAppInterface)
    JvPluginManager1: TJvPluginManager;
    //...
  public
    function GetPosition : TPoint;
    procedure SetPosition(const NewPos : TPoint);
    procedure DoSomethingSpecial(Name: String; OnClick: TNotifyEvent);
  end;



Добавлено @ 18:00
Обратите внимание TfrmMain наследуется от TForm - класса VCL и интерфейсов IUnknown, IMyMainAppInterface

Автор: borisbn 26.5.2011, 10:50
Цитата(ZVano @  25.5.2011,  17:58 Найти цитируемый пост)
Как в С++ реализовать следующий финт ушами от Delphi?

вообще-то, множественное наследование в VCL на Си++ невозможно, но попробуй включить в проект Builder'а приведённый тобой исходник на Delphi. После компиляции Builder создаст файл *.hpp. Глянь, что там. Может что и получится... хотя, врядли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)