![]() |
AW: Tutorial Interfaces
So isses. Immer, wenn es um maximale Flexibilität geht, sind Interfaces das probate Mittel dazu. Für jedes Fitzchen aber nur noch auf Interfaces zu setzen ist in meinen Augen sinnlos. Wie immer hängt es halt vom Einzelfall ab.
|
AW: Tutorial Interfaces
Zitat:
|
AW: Tutorial Interfaces
Zitat:
Denke nicht das er das böse gemeint hat. gruss |
AW: Tutorial Interfaces
Zitat:
Aber ich finde, dass Interfaces ganz und gar nicht das gleiche sind wie normale Klassen. ich finde normale Klassen wesentlich angenehmer zu schreiben. Wenn man X Objekte von Y Objekten ableiten muss, macht man im Grundaufbau irgendetwas falsch wie ich finde. Da helfen auch keine Interfaces. |
AW: Tutorial Interfaces
Kommt halt darauf an für was man es verwendet.
Wenn ich eine Funktion aus meiner DLL öffentlich machen will dann verwende ich Interface weil der Anwender sich dann nicht mehr um das laden der DLL kümmern muss. Zudem erspart es mir für eine Funktion mehrere Exports zu generieren die ich so mit einer Erledigen kann. gruss |
AW: Tutorial Interfaces
Hallo,
wenn ich bestehende Klassen, die nicht von einer Basisklasse abgeleitet sind, um eine gemeinsame Funktionalität erweitern will, geht das nur über Interfaces. |
AW: Tutorial Interfaces
Das Beispiel in #11 von DeddyH zeigt das eigentlich sehr schön.
Ohne Interfaces müsste man Wuppdi so schreiben:
Delphi-Quellcode:
Man muss also an der Stelle alle Klassen konkret kennen und darauf casten.
{ TWuppdi }
procedure TWuppdi.Consume(const O: TObject); begin if (O is TEdit) then ShowMessage((O as TEdit).DisplayString); if (O is TLabel) then ShowMessage((O as TLabel).DisplayString); if (O is TComboBox) then ShowMessage((O as TComboBox).DisplayString); end; Wenn man irgendwann 2 neue Klassen dort anzeigen möchte, muss man diese in der Prozedur nachträglich mit aufnehmen - und in allen anderen Prozeduren, die diese neuen Klassen kennen müssen. Auf eine gemeinsame Basisklasse zurückzugreifen geht hier ja nicht. Mit Interfaces ist es halt einfacher, zu prüfen, ob das vorliegende Objekt von der Prozedur bearbeitet werden kann. Man schaut sich nur noch an, ob das, was ich da habe displayed werden kann oder nicht. Man muss dann nicht mehr wissen, welche Klasse man konkret vorliegen hat und es kann sogar sein, dass man die konkrete Klasse überhaupt nicht kennt. Wie gesagt, man MUSS das natürlich nicht verwenden, aber es ist gut, wenn man es kennt und darauf zurück greifen kann, wenn man mit einfachen Klassen mal nicht so gut zum Ziel kommt. |
AW: Tutorial Interfaces
Der grösste Vorteil von Interfaces ist das die Consumer Klasse gar nichts von der Implementation mitbekommt.
Keinerlei Abhängigkeiten zu anderen Klassen. Jeder der versucht Unit Tests zu schreiben und das auch konsequent :oops: durchzieht will die Vorteile nicht mehr missen. Die einzige Abhängigkeit ist die Interface Unit, fertig. Ich arbeite in der CAD-Branche, wir müssen import und export zu verschiedenen Formaten bereithalten. Unser Klassen haben einfach Methoden die ein Interface entgegennehmen. Welches Format da dann wirklich dahintersteht is egal. Die verschiedenen Formate werden einfach bei einer Factory registriert.
Delphi-Quellcode:
Ob da jetzt ein Step, SAT, Igel oder was auch immer ankommt ist egal.
function readImport(Import : IImport3d) : boolean;
Die einzelnen Bereiche können unabhängig voneinander getestet werden und gut ist.. |
AW: Tutorial Interfaces
Ich verweise da mal schamlos auf meine Reihe von Blog-Artikeln von 2010 zum Visitor Pattern:
![]() ![]() ![]() ![]() Insbesondere Part 2 und 3 gehen auf die Vorteile bei der Verwendung von Interfaces ein. Ist aber auch schon etwas mehr zu lesen... |
AW: Tutorial Interfaces
Was ich mich schon länger frage: Gibt es eigentlich einen bestimmten Grund, warum Interfaces in Delphi keine privaten Methoden haben dürfen? Unter C++ ist das beispielsweise problemlos möglich.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz