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.