Einzelnen Beitrag anzeigen

_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#17

AW: Architektur / Projektstruktur / zirkuläre Referenz Problem

  Alt 29. Dez 2011, 13:12
Nochmal ein Danke an alle die hier bisher geantwortet haben. Allerdings hab ich nun ein Verständnisproblem in Bezug auf Vererbung. Normalerweise würde ich dafür einen neuen Thread eröffnen, aber da die Erklärung des Problems auf der bereits am Anfang gelisteten Erklärung basiert, packe ich das mal hier mit hinzu.

Und zwar existiert ja wie gesagt ein Engine-Objekt und (später) mehrere Manager. Diese sollen von einer Basisklasse abgeleitet werden. Nun ergibt sich grob zusammengefasst folgende Konstruktion.

Delphi-Quellcode:
unit ICE_Interfaces;

interface

const
  IID_IICEEngine: TGUID = '{1E017D9B-7CA7-4D5E-A124-09A11C38956C}';
  IID_IICEEngineObject: TGUID = '{4B79DEA1-B898-4604-8F34-BC7F9D9575CA}';
  IID_IICEResourceManager: TGUID = '{B773EEA0-5055-4519-8D91-BAAD290712BD}';

{ Forward. }

type
  IICEEngine = interface;
  IICEEngineObject = interface;
  IICEResourceManager = interface;

  IICEEngine = interface(IUnknown)
    ['{1E017D9B-7CA7-4D5E-A124-09A11C38956C}']
    function GetResourceManager: IICEResourceManager; safecall;
    property ResourceManager: IICEResourceManager read GetResourceManager;
  end;

  IICEEngineObject = interface(IUnknown)
    ['{4B79DEA1-B898-4604-8F34-BC7F9D9575CA}']
    function GetEngine: IICEEngine; safecall;
    property Engine: IICEEngine read GetEngine;
  end;

  IICEResourceManager = interface(IICEEngineObject)
    ['{B773EEA0-5055-4519-8D91-BAAD290712BD}']
  end;

implementation

end.
Delphi-Quellcode:
unit ICE_BaseClasses;

interface

uses
  ICE_Interfaces;

type
  TICEEngineObject = class(TInterfacedObject, IICEEngineObject)
  private
    FEngine: IICEEngine;
    function GetEngine: IICEEngine;
  protected
    function _GetEngine: IICEEngine; safecall;

    { IICEEngineObject }

    function IICEEngineObject.GetEngine = _GetEngine;
  public
    constructor Create(e: IICEEngine); virtual;

    property Engine: IICEEngine read GetEngine;
  end;

implementation

{ TICEEngineObject }

constructor TICEEngineObject.Create(e: IICEEngine);
begin
  FEngine := e;
end;

function TICEEngineObject.GetEngine: IICEEngine;
begin
  Result := FEngine;
end;

function TICEEngineObject._GetEngine: IICEEngine;
begin
  Result := Engine;
end;

end.
Delphi-Quellcode:
unit ICE_ResourceManager;

interface

uses
  Classes, SysUtils,

  ICE_BaseClasses, ICE_Interfaces;

type
  TICEResourceManager = class(TICEEngineObject,IICEResourceManager)
  private

  protected

  public
    constructor Create(e: IICEEngine); override;

  end;


implementation

{ TICEResourceManager }

constructor TICEResourceManager.Create(e: IICEEngine);
begin
  inherited Create(e);
end;

initialization

finalization

end.
IICEResourceManager erbt von IICEEngineObject.
Genaue wie TICEResourceManager von TICEEngineObject.

Code:
TICEEngineObject -> implementiert -> IICEEngineObject
     |                                        |
  Ableitung                              Ableitung
     |                                        |
TICEResourceManager -> implementiert -> IICEResourceManager
Nun bekomme ich beim kompilieren folgende Fehlermeldung "[Pascal Fehler] ICE_ResourceManager.pas(40): E2003 Undefinierter Bezeichner: 'GetEngine'".

Manchmal seh ich glaube ich den Wald vor lauter Bäumen nicht. Ich kann diese Fehlermeldung in diesem Zusammenhang nicht nachvollziehen bzw. sehe keine Begründung dafür.
  Mit Zitat antworten Zitat