Autor Beitrag
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 08.03.09 21:16 
Hallo

Nach www.delphi-treff.de/...t-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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
3:
IAuto = interface
  function GetPrice: Currency;
end;
Und dann implementierst du dieses mit deinen Klassen:
ausblenden 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.


Zuletzt bearbeitet von jaenicke am Mo 09.03.09 00:49, insgesamt 3-mal bearbeitet
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 08.03.09 22:00 
Hier ein Beispiels Tutorial für ein PlugIn in einer eigenen Anwendung.

Ein anderes Tutorial zu Interfaces findes Du hier.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.03.09 00:40 
@jaenicke: Sehr gut erklärt. Da hatte ich auch immer Verständnisprobleme.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Mo 09.03.09 10:49 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

Jetzt stellt sich mir die Frage: Wann muss ich bestimmte Methoden verlangen? Hat jemand ein Beispiel, wann ich das brauche?


Ich muss mal wieder meine beiden Artikel dazu raushaengen lassen:

www.dummzeuch.de/del...erfaces/deutsch.html

www.dummzeuch.de/del...rfaces2/deutsch.html

twm
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: Di 10.03.09 18:41 
Danke an alle! :zustimm:
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 10.03.09 19:21 
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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)