Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wozu Interfaces?
Jakob_Ullmann - So 08.03.09 21:16
Titel: Wozu Interfaces?
Hallo
Nach
http://www.delphi-treff.de/no_cache/sprachen/object-pascal/interfaces/ weiß ich jetzt, dass ich mit Interfaces von Objekten die Implementation von bestimmten Methoden verlangen kann. Das hab ich auch gelesen, als ich mal nach dem Sinn (Forensuche: Interfaces Sinn) gesucht habe. Jetzt stellt sich mir die Frage: Wann muss ich bestimmte Methoden verlangen? Hat jemand ein Beispiel, wann ich das brauche?
Danke schonmal
edit: Und wozu brauche ich eigentlich eine globale Identifikationsnummer?
bis11 - So 08.03.09 21:35
Hallo Jakob,
zum Beispiel bei einem PlugIn-System für Deine eigene Anwendung ist es sinvoll Interfaces zu nutzen.
Jakob_Ullmann - So 08.03.09 21:41
Puh, also mit PlugIn-Systemen hab ich mich noch nicht so beschäftigt. Ich werde mich mal damit beschäftigen und dann sehen, ob ich's kapiere. Ich melde mich also in ein paar Tagen noch mal. Danke erstmal!
jaenicke - So 08.03.09 21:41
Stell dir vor du hast zwei Autotypen: Mercedes und Opel. Nein, lieber: Mercedes und VW. Sonst ist das Beispiel vielleicht bald veraltet. :mrgreen:
Jedenfalls definierst du dann zwei Klassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TMercedes = class(TObject) Stern: TStern; public function GetPrice: Currency; end;
TVW = class(TObject) Logo: TVWLogo; public function GetPrice: Currency; end; |
Jetzt wäre es ja gut, wenn du einfach eine Variable von einem gemeinsamen Typ hättest, dann könntest du Objekte von beiden Typen hineinlegen und GetPrice aufrufen ohne zu wissen welcher Typ es genau ist.
Dafür könntest du eine gemeinsame Elternklasse definieren. Aber damit würdest du Verbindungen im Quelltext herstellen, die du vielleicht gar nicht herstellen willst. Und du müsstest die Funktion überschreiben.
Deshalb kannst du ein Interface definieren:
Delphi-Quelltext
1: 2: 3:
| IAuto = interface function GetPrice: Currency; end; |
Und dann implementierst du dieses mit deinen Klassen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TMercedes = class(TInterfacedObject, IAuto) Stern: TStern; public function GetPrice: Currency; end;
TVW = class(TInterfacedObject, IAuto) Logo: TVWLogo; public function GetPrice: Currency; end; |
Jetzt musst du woanders nur noch IAuto kennen. ;-)
Wenn du COM benutzt, dann brauchst du das auch. Dann sagst du: Ok, ich möchte jetzt ein Objekt haben, das dieses Interface implementiert. Dabei musst du dann rein gar nichts über das Objekt wissen.
Delete - Mo 09.03.09 00:40
@jaenicke: Sehr gut erklärt. Da hatte ich auch immer Verständnisprobleme.
UGrohne - Mo 09.03.09 11:10
Das gleiche ließe sich erreichen, indem man eine gemeinsame abstrakte Elternklasse definiert mit abstrakten Methoden. Diese müssen in den nachfahren implementiert werden. Der entscheidende Vorteil von Interfaces in diesem Fall ist jedoch: Eine Klasse kann nur von einer Basisklasse erben (Mehrfachvererbung gibt es nur in C++), Interfaces kann ich jedoch mehrere gleichzeitig implementieren. Damit kannst Du Interfaces für verschiedene Funktionalitäten der Klasse definieren und alle implementieren, während die verwendenden Elemente diese über die Interfaces verwenden.
Besonders extrem ist das in .NET realisiert, hier gibt es Interfaces für alle möglichen Dinge, z.B. IDisposable für eine Beeinflussung des Garbage Collectors beim Aufräumen von Klassen, IEnumerable für Listenklassen, ISerializable für serialisierbare (also z.B. in XML übersetzbare Klassen), IComparable für die Implementation für Vergleiche (notwendig für die Standard-Sortierungsfunktionen) usw. usf.
Und alle diese Interfaces sorgen für eine Implementation verschiedenster Verhaltensweisen, wie oben z.B. Unterstützung für Auflistungen, Speicherung, Vergleichen, Entsorgen. Diese Funktionalitäten werden dann über die Interfaces von den entsprechenden Implementationen angesprochen.
So, ich hoffe, ich konnte noch einen weiteren Anwendungsfall für Interfaces erklären ;).
Achja, Three-Tier-Architekturen verwenden auch sehr stark Interfaces, um die Server- und Client-Implementationen sauber trennen zu können.
Jakob_Ullmann - Di 10.03.09 18:41
Danke an alle! :zustimm:
delfiphan - Di 10.03.09 19:21
Jakob_Ullmann hat folgendes geschrieben : |
edit: Und wozu brauche ich eigentlich eine globale Identifikationsnummer? |
Damit das Interface auch über Modul- und Sprachgrenzen hinweg erkannt werden kann. Vor allem im Zusammenhang mit COM eine Notwendigkeit. Die Eindeutigkeit kann durch den Interface-Namen nicht garantiert werden. Bei der GUID kannst du aber sicher sein, dass es zu keinen zufälligen Kollisionen kommen kann, da diese wirklich eindeutig sind (wird je nach Implementation über die eindeutige MAC-Adresse der Netzwerkkarte berechnet)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!