Hallo!
Ich beschäftige mich gerade erstmalig tiefer mit
COM und hier spielen Interfaces ja eine entscheidende Rolle. Allerdings verstehe ich den Sinn und Zweck dahinter nicht so ganz.
Bislang hatte ich eigentlich eine recht klare Vorstellung davon was ein Interface ist und wofür man es braucht. Bei den Tutorials zu
COM ist das Ganze aber ins Schwanken geraten. Am Besten erkläre ich erstmal was ich unter einem Interface verstehe und wenn ich Blödsinn erzähle könnt ihr mich gerne korrigieren.
Was ich bislang unter einem Interface verstehe:
Ein Interface definiert eine Schnittstelle, also eine Menge von Methoden. Hierbei wird nur gesagt welche Methoden es gibt und wie diese aussehen (Name und Signatur), nicht aber wie diese implementiert sind. In dieser Hinsicht ist ein Interface nichts anderes als eine abstrakte Klasse: In beiden Fällen werden Methoden definiert aber nicht implementiert. Einziger Unterschied ist, dass ein Interface ausschließlich Definitionen enthält, während eine in einer abstrakten Klassen neben abstrakten Methoden durchaus auch konkrete vorhanden sein können.
Interfaces sind also ein Zusicherung, dass eine Klasse die ein Interface implementiert bestimmte Methoden anbietet. Interfaces sind notwendig, weil es in Delphi keine Mehrfachvererbung gibt. Andernfalls könnte man auch nur mit abstrakten Klassen arbeiten.
Was bei COM anders ist
Soweit ich das Verstanden habe muss jedes Interface mit einer
GUID versehen und von IUnknown abgeleitet werden. Die
GUID ist notwendig, damit ein Interface eindeutig identifiziert und im System registriert werden kann. IUnknown ist das "Oberinterface" aller anderen Interfaces. Hier wird die Implementierung für die Referenzzählung, etc. gefordert.
Habe ich das soweit richtig beschrieben? Dann ergeben sich für mich ein paar Fragen die ich mir nicht beantworten kann:
Wofür brauche ich die die GUID und IUnknown bei der "normalen" Programmierung?
Den Sinn und Zweck den diese Teile bei
COM verwenden habe ich durchaus verstanden, aber was ist wenn ich gar kein
COM verwende sondern mir ein Interface einfach nur eine Schnittstelle zusichern soll? Wozu brauche ich dann eine
GUID? Wozu brauche ich dann einen Referenzzähler? Gibt es bei Delphi gar keine "normalen" Interfaces die nur für die "normale" Programmierung genutzt werden und nicht für
COM?
Wozu sind Interface-Objekte notwendig?
In mehreren Tutorials werden Interfaces quasi als Objekte verwendet. Hier ein Beispiel:
Delphi-Quellcode:
type
IMyInterface = interface
['{6675C5C0-D95C-11D4-BDE0-00A024BAF736}']
procedure DisplaySomething;
end;
TMyClass = class(TInterfacedObject, IMyInterface)
procedure DisplaySomething;
end;
TMyForm = class(TForm)
TestBtn: TButton;
procedure TestBtnClick(Sender: TObject);
end;
var
MyForm: TMyForm;
implementation
{$R *.DFM}
procedure TMyForm.TestBtnClick(Sender: TObject);
var
MyClass : TMyClass;
MyInterface : IMyInterface;
begin
// Warum erstellt man ein "Interface Objekt"?
MyInterface := TMyClass.Create;
MyInterface.DisplaySomething;
// Warum erstellt man nicht direkt ein "echtes" Objekt und benutzt das?
MyClass := TMyClass.Create;
MyClass.DisplaySomething;
end;
Welchen Sinn/Vorteil/Nutzen/Zweck hat dieses Vorgehen? Warum erstellt man nicht einfach ein "normales" Objekt der Klasse die das Interface implementiert und verwendet dieses?
Herzlichen Dank
Ares