![]() |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Zitat:
|
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Hi Benmik,
ich habe mal ein kleines Einsteigertutorial für Interfaces erstellt. Vielleicht hilft es Dir ja etwas: ![]() Interfaces sind hilfreich, wenn man gleiche Funktionalitäten in unterschiedlichen Klassen unterbringen will. Es erspart einem das Prüfen und Casten von vorliegenden Objekten wie
Delphi-Quellcode:
Statt dessen schreibt man einfach
if (MyObj is ClassA) then
(MyObj as ClassA).DoX else if (MyObj is ClassB) then (MyObj as ClassB).DoX;
Delphi-Quellcode:
Dan ist völlig egal, was da für ein Objekt dahinter steckt. Wichtig ist nur noch, ob DoX unterstützt wird oder nicht.
var
lDoX: IDoX; ... if Supports(MyIntf, IDoX, lDoX) lDoX.DoX; Fluch und Segen (und außerhalb von Delphi unüblich) ist die automatische Referenzzählung. Objekte hinter Schnittstellen werden automatisch freigegeben, wenn es keine Referenzen mehr darauf gibt. Das kann man als positiv oder auch negativ bewerten - je nach den vorliegenden Bedürfnissen. |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Hallo Stahli, deine Produktionen waren für mich sozusagen erste Anlaufstelle. Ich habe zum ersten Mal im Groben kapiert, was Interfaces überhaupt sind. Jetzt stehe ich vor der moralischen Entscheidung :? : Muss ich die auch verwenden? Die meisten Tutorial-Autoren machen eine Bemerkung, dass für "einfache" Delphi-Programme Interfaces meist nicht notwendig sind. Deshalb hat mich Sir Rufos Bemerkung verwirrt: Warum sollte mann immer das Interface "anheften"? Ist das wirklich die Regel, dass man so viele Objekte hat, die man unter einem Interface versammeln muss?
Und was ich über die Tücken der Referenzzählung gelesen habe: Da sträuben sich die Haare. Also, selbst wenn ich drei Objekte hätte, ich würde die Klassen einzeln erstellen und gut ist. Voraussetzung natürlich: Ich habe weder Schnittstellen nach außen noch irgendwelche Plugins oder Ähnliches. Aber vielleicht übersehe ich da was. Daher die Bitte um eine praktische Verwendung. |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Zitat:
|
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Und könntest du neben Stahli auch mich mit einer Antwort bedenken?
|
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Zitat:
Habe ich damals beim designen der Klasse nachgedacht und das Interface
Delphi-Quellcode:
implementiert, dann sieht mein Code so aus
IStreamPersist
Delphi-Quellcode:
Und wenn ich es wieder zurück haben möchte?
MyDataSet.Append;
MyDataSet.FieldByName( 'BlobData' ).Assign( MyInstance ); MyDataSet.Post;
Delphi-Quellcode:
// leider nur sehr kurz
MyInstance.Assign( MyDataSet.FieldByName( 'BlobData' ) ); |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Hab Dank. Das muss ich mir erstmal zu Gemüte führen. Vermutlich liegt für mich der Punkt, an dem ich mal Interfaces brauchen kann, in einiger Ferne. Das war bei generischen Objektlisten allerdings auch mal so, und heute kann ich mir ein Leben ohne sie gar nicht mehr vorstellen. :thumb:
|
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
@Benmik
Also grundsätzlich würde ich bei einem überschaubaren Projekt keine Interfaces verwenden. Erst mal bringt das Dir nämlich nichts. Interfaces bringen Dir nur etwas, wenn sie Vorteile bringen. ;-) Wenn die Wahrscheinlichkeit besteht, dass Du später verschiedene Klassen dynamisch tauschen möchtest, dann machen Interfaces (und der etwas höhere Aufwand) Sinn. Man kann dann eher in "Funtionalitäten" denken und die Klassen sind dann "Funktionalitätenblöcke" (IkannA, IkannB, IkannC). Wenn Du mit Klassen nicht mehr weiter kommst und andauernd casten musst, dann denke halt über den Einsatz von Interfaces nach. Als reinen Selbstzweck macht das wenig Sinn. @Sir Rufo Oh, ich sehe gerade, man kann Interfaces offenbar auch TObject zuweisen und nicht nur TInterfacedObject und somit ohne Referenzzählung arbeiten. War mir noch gar nicht klar. Werde ich heute Abend gleich mal versuchen. Ich dachte es geht nur mit (Leer-)Überschreiben der Referenzzählung. |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Mit einem Interface legt man fest, was die Klasse implementieren muss.
Basis für jedes Interface ist dabei
Delphi-Quellcode:
und das legt 3 Methoden fest, die also immer wie auch immer vorhanden sein müssen.
IInterface
Wie diese Implementierung und das Verhalten aussieht ... bleibt dem Klassen-Designer überlassen.
Delphi-Quellcode:
hat diese 3 Methoden schon implementiert und ich kann von da meine Klasse ableiten ... wenn die Implementierung von
TInterfacedObject
Delphi-Quellcode:
auch passt.
TInterfacedObject
Und es gibt noch eine Menge mehr Spielarten gerade im Bezug auf Interfaces, die das ganze dann auch sehr flexibel machen. |
AW: TObjectList-Object da, aber beim Zugriff Stack-Overflow
Stimmt, ich hatte mich hier von einem anderen Thread in die Irre führen lassen. Aber Das Überschreiben (Stillegen) der Referenzzählung werde ich nochmal versuchen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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