AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schon wieder: Warum Interfaces

Ein Thema von exilant · begonnen am 19. Okt 2016 · letzter Beitrag vom 21. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 14:30
Wobei man Ableitungen von Interfaces eher vermeiden sollte. Hier werden ja eher Funktionalitäten beschrieben und dabei ist es i.d.R. sinnvoll, viele kleine eigenständige Funktionalitäten (Interfaces) zu definieren als von anderen abzuleiten.
Du hast mir gerade einen Anreiz gegeben, mein noch am Anfang stehendes Projekt nochmal etwas umzustrukturieren. Allerdings habe ich da dann gerade ein Verständnisproblem.

Folgender Fall:

Delphi-Quellcode:
IMyIntf1 = interface(IInterface)
  procedure SomeMethod1();
  procedure SomeMethod2();
end;

IMyIntf2 = interface(IMyIntf1) // Hier noch abgeleitet von IMyIntf1
  procedure SomeMethod3();
end;
Delphi-Quellcode:
TMyClass = class(TInterfacedObject, IMyIntf1, IMyIntf2) // Hier könnte man IMyIntf1 ja denke ich auch weglassen
  procedure SomeMethod1();
  procedure SomeMethod2();
  procedure SomeMethod3();
end;
Delphi-Quellcode:
TMyOtherClass = class(TObject)
type
private
  MyIntfInstance: IMyIntf2; // Hier die 2 beachten
  procedure CallInterfaceMethod;
end;

implementation

procedure TMyOtherClass.CallInterfaceMethod;
begin
  MyIntfInstance.SomeMethod1(); // Hier die 1 beachten.
end;
In dem Konstrukt mit der Ableitung des Interfaces 2 von 1 ist das oben gezeigte Beispiel kein Problem. Wenn ich aber jetzt IMyIntf2 gesondert behandele und in TMyClass implementiere, dann erhalte ich ja eine Fehlermeldung, dass SomeMethod1() in dem Kontext nicht verfügbar ist.

Nur wie löse ich jetzt das Problem? Ich will ja jetzt nicht so viele Interfacevariablen in meiner Klasse anlegen, wie meine Interfaceklasse Interfaces importiert. Das halte ich für sehr umständlich. Ich kenne zwar vom Hören die Methode Supports(), weiß aber nicht, in wiefern das darauf anzuwenden ist.

Hat da jemand einen Tipp?

Geändert von Aviator (20. Okt 2016 um 14:32 Uhr) Grund: Interfaces in ein Delphi Tag zusammengefasst, da besser lesbar
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#2

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 14:40
Ganz wichtig, @Jim Carey: Klassen IMMER! Interfaces dann wenn es sinnvoll ist (darüber streiten sich dann die Experten ) Ein Interface ersetzt keine Klasse, Interfaces sind "nur" Vorschriften darüber wie wirkliche Implementierungen auszusehen haben.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#3

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 14:42
Klassen IMMER! Interfaces dann wenn es sinnvoll ist
Mit der Antwort kann ich etwas anfangen und bestätigt mich in meiner Meinung, nicht alles sofort auf Interfaces umstellen zu müssen, nur weil es sie gibt

Danke.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 14:43
Ich mache das normalerweise so:
Delphi-Quellcode:
type
  IIntf1 = interface
    ['{AA7958DE-7A80-4F11-A5D5-A70BB3D51320}']
    procedure SomeMethod1;
    procedure SomeMethod2;
  end;

  IIntf2 = interface
    ['{A25606F4-B121-4FA5-BF07-B40C7784FFB7}']
    procedure SomeMethod3;
  end;

  TTestClass = class(TInterfacedObject, IIntf1, IIntf2)
  public
    //IIntf1
    procedure SomeMethod1;
    procedure SomeMethod2;
    //IIntf2
    procedure SomeMethod3;
  end;

{ TTestClass }

procedure TTestClass.SomeMethod1;
begin
  ShowMessage('SomeMethod1');
end;

procedure TTestClass.SomeMethod2;
begin
  ShowMessage('SomeMethod2');
end;

procedure TTestClass.SomeMethod3;
begin
  ShowMessage('SomeMethod3');
end;

procedure TFormTest.Button1Click(Sender: TObject);
var
  Test: IIntf1;
  Intf2: IIntf2;
begin
  Test := TTestClass.Create;
  Test.SomeMethod1;
  if Supports(Test, IIntf2, Intf2) then
    Intf2.SomeMethod3;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 14:58
Genau so.

Ich will nur noch ergänzen:

Um Supports nutzen zu können muss das Interface eine Guid haben.
Und Supports liefert im letzten Parameter automatisch den Cast des übergebenen Objektes/Interfaces auf das im zweiten Parameter übergebene Interface zurück. Oder Nil wenn Supports nicht true ist.

Ich hatte mich damit (auch?) zunächst schwer getan, aber es ist eigentlich ganz simpel.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 15:05
@DeddyH: Danke. Super Beispiel. Wird aber dann doch immer etwas aufwendig wenn man immer wieder mit Supports() abfragen muss.

Um Supports nutzen zu können muss das Interface eine Guid haben.
Das wa rmir bekannt, aber gut das du das für alle anderen hier auch nochmal erwähnst.
Und Supports liefert im letzten Parameter automatisch den Cast des übergebenen Objektes/Interfaces auf das im zweiten Parameter übergebene Interface zurück. Oder Nil wenn Supports nicht true ist.
Ok. Das wusste ich jetzt noch nicht, wäre aber das nächste gewesen, was ich mir angeschaut hätte.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#7

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 15:15
Ob ich nun Supports() aufrufen muss oder Dinge der Art
Delphi-Quellcode:
if MyObject is TDingens then
  TDingens(myObject).Machwas;
, komfortabler wird es nicht.

[edit] Nachtrag: stahli hat Recht, man kann das übrigens auch anders formulieren.
Delphi-Quellcode:
Supports(Test, IIntf2, Intf2);
if Assigned(Intf2) then
  Intf2.SomeMethod3;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 15:23
Hmm, ja stimmt auch wieder.

Was sagt denn der TE "Exilant" mittlerweile zu dem Thema? Ist das alles jetzt etwas verständlicher?
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 16:28
Was sagt denn der TE "Exilant" mittlerweile zu dem Thema? Ist das alles jetzt etwas verständlicher?
Zunächst mal vielen Dank an alle Schreiber hier. Eine Menge Input. So eine Resonanz habe ich nicht erwartet. Das Thema treibt doch viele um. Wie weit mich das weiter gebracht hat kann ich noch nicht abschätzen. Ich muss mir das erst mal in Ruhe zu Gemüte führen. Dazu werde ich etwas Zeit brauchen. Dieser Thread wird dazu sehr nützlich sein. Danke auch besonders an stahli, der mich auf diesen Thread hingewiesen hat.

Das mit der "Verständlichkeit" war wie ich geschrieben hatte nicht so das Problem. Interfaces setze ich seit Ewigkeiten für die Office Atomation ein. Ausserdem kommuniziere ich hier mit OPC Servern (nicht UA) - das ist auch COM/DCOM und das klappt. Auch wenn die Programmierung von dem Zeugs eine Strafe ist.

Ich suche/suchte ja nach dem Nutzen von Interfaces in eigenen Anwendungen. Und in denen verzichte ich natürlich auf COM/DCOM und DLLs solange ich es selbst in der Hand habe. Interfaces als wie Lemmy es sagt "logische oder zwingende Weiterentwicklung klassicher OOP" zu sehen: Da muss ich erstmal hinkommen.

Ich denke das in einigen Beiträgen in diesem Thread echtes Gold steckt und mich die Nützlichkeit von Interfaces in eigenen Anwendungen jenseits von COM erkennen lässt. Ich werde lesen, testen und wieder lesen.

Nochmal vielen Dank an alle. Ich werde mich bestimmt noch zu dem Thema melden sowie ich das hier durchgeackert habe. Ich denke da werden noch ein paar Dinge offen bleiben...
Anything, carried to the extreme, becomes insanity. (Exilant)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#10

AW: Schon wieder: Warum Interfaces

  Alt 20. Okt 2016, 16:57
Delphi-Quellcode:
Supports(Test, IIntf2, Intf2);
if Assigned(Intf2) then
  Intf2.SomeMethod3;
Könnte man das nicht kürzen?

Delphi-Quellcode:
if Supports(Test, IIntf2, Intf2) then
  Intf2.SomeMethod3;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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