Einzelnen Beitrag anzeigen

HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Idee Zur Synchronisation eines Interfaces mit Klasse (mit MMX?)

  Alt 24. Jul 2018, 16:10
Hallo

da Uwe ja mal nach Feature Vorschlägen zum MMX gefragt hat möchte ich jetzt gerne einen los werden:

Motivation
Die Synchronisation zwischen einem Interface und einer implementierenden Klasse ist irgendwie nervig und selbst dass was ich an Tool-Unterstützung gesehen (und verstanden habe?) überzeugt mich nicht.

Wie ich es mir vorstelle würde

Ein Beispiel mit einer Unit für das Interface und einer für die Klasse (wichtig sind die speziellen Kommentare).

Zuerst lege ich die Interface-Unit an:
Delphi-Quellcode:
unit DTO.Person.Intf;

interface

type
  IPerson = interface {!MMX: implemented by TPerson in DTO.Person.Impl}
  ['{1D826CBD-244A-4D1C-ADCC-C1AB8FAB36B2}']
  end;

implementation

end.
Dann die Klassen-Unit:
Delphi-Quellcode:
unit DTO.Person.Impl;

interface

uses
  DTO.Person.Intf;

function NewPerson: IPerson;

implementation

type
  TPerson = class(TInterfacedObject, {!MMX: implements in DTO.Person.Intf } IPerson )
  private
    FAge: Integer;
    procedure CheckData;
    function GetName: string;
    procedure SetAge(const Value: Integer);
    procedure SetName(const Value: string);
  public
    constructor Create;
    destructor Destroy; override;
    function YearOfBirth: integer;
    property Name: string read GetName write SetName;
    property Age: Integer read FAge write SetAge;
  end;

{ method implementation here ... }

end.
Befinde ich mich in der Interface oder Klassen Deklaration kann ich über einen Short Cut (z.B. Shift+Ctrl+I) eine Synchronisation auslösen.
Voraussetzung dafür wäre der jeweilige Kommentar mit dem MMX Start-Code {!MMX: ... }.

Dann wird die aktuelle Interface Methodenlist verworfen und aus der Klasse neu aufgebaut und zwar nach folgenden Regeln:
  • Nimm alle Methoden und Properties mit den Sichtbarkeiten Public, Publisched oder Auto.
  • Lasse alle Konstruktoren und Destruktoren weg.
  • Lasse alle Properties weg die sich bei read oder write auf ein Klassenfeld beziehen.
  • Referenziet ein Property bei read oder write eine Methode mit einer geringeren Sichtbarkeit übernehme auch diese.

Das Interface würde anschließend wir folg aussehen:
Delphi-Quellcode:
unit DTO.Person.Intf;

interface

type
  IPerson = interface {!MMX: implemented by TPerson in DTO.Person.Impl}
  ['{1D826CBD-244A-4D1C-ADCC-C1AB8FAB36B2}']
    function GetName: string;
    procedure SetName(const Value: string);
    function YearOfBirth: integer;
    property Name: string read GetName write SetName;
  end;

implementation

end.
Die Syntax für die Kommentarzeilen wäre
  • für das Interface (muss hinter dem Interface-Header stehen)
    {!MMX: implemented by <ClassType> [in <UnitName>] }
  • für die Klasse (muss vor dem zu implementierenden Interface stehen)
    {!MMX: implements [in <UnitName>] }

Was ist eure Meinung dazu (Vielleicht ist es ja auch einfach nur die Hitze )?

Ciao Heinz Z.
  Mit Zitat antworten Zitat