![]() |
AW: Interfaces + Factorys
Ja gut, aber das kann auch auf eine einfache Klasse oder Prozedur zutreffen:
Delphi-Quellcode:
Hier ist es für die Benutzung der Prozedur auch unerheblich, was sie intern macht.
procedure LiesDatenEin(Param: Integer);
begin case ParamOderRechteOderIrgendwas of 1: LiesXML; 2: LiesCSV; 3: LiesWWW; end; end; Solche Beispiele finde ich daher ungünstigt, da sie den zu erklärenden Sachverhalt nicht herausgelöst von anderen/allgemeineren Aspekten auf den Punkt bringen. |
AW: Interfaces + Factorys
Zitat:
Bei einem Interface sollte bei einem IKannFliegen.Flieg immer klar sein, was diese Methode macht. Dementsprechend ist für den Aufrufer der Methode egal, obs durch Flügelschlagen oder Nachbrenner zünden passiert - hauptsache das Ding fliegt. Wenn man sich nicht drauf einlässt, dass ein Interface (genau wie eine abstrakte Klasse) eine Abstraktion ist - kann man die Geschichte mit den Interfaces auch gleich wieder vergessen. |
AW: Interfaces + Factorys
Vielleicht sollte man Interface einmal definieren (falls ich hier Mist schreibe, möge man mich bitte korrigieren): es handelt sich dabei lediglich um eine Vereinbarung, d.h. hinter so einer Interface-Variablen steckt letzten Endes irgendetwas, was die im Interface deklarierten Methoden und Eigenschaften aufweist. Worum es sich dabei konkret handelt (TDings, TBums oder TWuppdi) spielt überhaupt keine Rolle. Das ist somit noch etwas abstrakter als eine abstrakte Klasse, denn dort weiß ich zumindest, dass es sich um eine Ableitung davon handeln muss. Bei Verwendung von Interfaces hingegen muss keine Klassenhierarchie eingehalten, sondern sie können auf einer beliebigen Vererbungsebene implementiert werden.
|
AW: Interfaces + Factorys
Zitat:
|
AW: Interfaces + Factorys
Zitat:
Denn wie DeddyH korrekt angemerkt hat, handelt es sich bei den Interfaces um Vereinbarungen, dass das Dings dahinter etwas bestimmtes macht. So wie aus ner Steckdose Strom kommt, ob der aus Wind, Sonne, Wasser, Kohle oder Kernkraft gewonnen wird, ist für die Funktion des Geräts, was du anschließt nicht ausschlaggebend. Ich erwähne das, weil es im Umgang mit Interfaces wichtig ist, sich nicht auf irgendwelche Implementierungsdetails zu verlassen. |
AW: Interfaces + Factorys
Zitat:
|
AW: Interfaces + Factorys
@DeddyH
Würde ich zustimmen. @Jumpy Wie die Klassen aussehen, ist hier m.E. gar nicht so wichtig. Wichtig ist, dass es eine abstrakte Schnittstelle gibt, die dann mit mehreren Varianten erledigt werden kann. In einer Prozedur würde ich eine Fallentscheidung vielleicht nach den vergebenen Nutzerrechten oder der Mondphase treffen (das meinte ich mit meinem case-Beispiel) und bei der Arbeit mit Interfaces würde man seiner Interfacevariable einfach einer Instanz der Klasse A, B, oder C übergeben. Die Interface-Lösung ist eleganter und flexibler, macht aber letztlich das Gleiche, nämlich ermöglicht es, eine Aufgabe mit unterschiedlichen Codestücken zu erledigen. @Daniel Ok, ich dachte, das wäre bei meinen Erklärungen ausreichend klar geworden. (Ist schon schwierig, hier alle auf einen Nenner zu kriegen ;-)) @all Sir Rufos Beispiel war ja grundsätzlich zutreffend. Ich fand es nur zu detailliert, um das Wesentliche hervozuhen. Und dieser Code zum Schluss ist (für mich) nicht nachvollziehbar und hat wohl erst die Verwirrung verursacht. |
AW: Interfaces + Factorys
Zitat:
Das zu erklären wäre - um bei dem Beispiel von der Steckdose zu bleiben - so, als ob ich jemandem der nen Haushaltsgerät an ne Steckdose anschließt, erklären müsste, wie nen Atomkraftwerk funktioniert :) |
AW: Interfaces + Factorys
Die wesentliche Grundidee der Objektorientierung ist Information Hiding,
auch Datenkapselung genannt. Der Nutzer soll nur gewisse Gebrauchswerte kennen, die er ausschließlich verwendet. Er weiß über den internen Ablauf nichts. Beispiel Tabelle: Die Nutzerfunktionen seien Eintragen eines Elementes und Abfragen, ob ein Item Element der Tabelle ist. Je nach Anwendungsfall kann das nun unterschiedlich implementiert werden, als lineare Liste, als Hashtabelle, als Datenbank etc. Zumindest in dieser Hinsicht ist Delphi keine objektorientierte Sprache, so wie auch C# und insbesondere Java das nicht sind. In dem hier verwendeten Kontext sind Interfaces nun die Krücke, mit der versucht wird, das nachträglich in Delphi hinzubekommen. Das geht aber nur auf der syntaktischen Ebene, denn es gibt in diesen Sprachen keinerlei Mittel, mit denen man die Semantik auf der abstrakten oder Nutzerebene ausdrücken kann. Die Benennung einer Prozedur als "Flieg" hindert doch niemanden daran, die als "Schwimm" zu implementieren. Um auf das oben angedeutete Beispiel zurückzukommen: Was passiert, wenn ein Element mehrfach eingetragen wird? Ist es dann nur einmal drin? Wie reagiert die Funktion Abfragen, wenn das Element nicht in der Tabelle vorhanden ist? Ohne Einsicht in die Implementierung lassen sich diese Informationen nicht gewinnen. Man kann durch die Verwendung von Interfaces oder abstrakter Klassen sicher einiges entkoppeln, aber letztendlich bleibt der Einblick in das Innere einer Klasse unverzichtbar, wenn man in Delphi & Konsorten programmiert, leider. |
AW: Interfaces + Factorys
Ja, das stimmt absolut.
Und genau darauf wollte ich hier hinaus: WIE genau "Flieg" oder "GetData" in den Klassen genau realisiert werden kann, sollte hier nicht unbedingt besprochen werden. DASS das natürlich aber in den Klassen gelöst werden muss (und nicht in der Schnittstelle) ist natürlich richtig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 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