AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fluent Interface - keine Vererbung möglich?

Ein Thema von hschmid67 · begonnen am 29. Okt 2017 · letzter Beitrag vom 2. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2   
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
53 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fluent Interface - keine Vererbung möglich?

  Alt 29. Okt 2017, 14:47
Delphi-Version: 5
Hallo Zusammen,

ich bin gerade auf ein Problem gestoßen und glaube, dafür gibt es keine elegante Lösung. Aber vielleicht kommt Ihr doch weiter als ich:

Ich habe eine Klasse gefunden, die ich recht gut finde, und diese ist als Fluent Interface implementiert (es geht um Cesar Romeros Rest Client). Wirklich schick für Rest-Aufrufe!

Aber wie das so ist, es fehlt doch immer etwas, was man gerne hätte, und deshalb würde ich die Klasse gerne erweitern. Doch das scheint mit einem Fluent Interface nicht zu funktionieren. Das Problem liegt vereinfacht wohl daran:

Delphi-Quellcode:
TKlasseA = class
  function TuEtwas: TKlasseA;
end;

TKlasseB = class(TKlasseA)
  function TuEtwasAnderes: TKlasseB;
end;
Wenn ich nun die KlasseB erzeuge und aufrufe, etwa so:

Delphi-Quellcode:
Instance := TKlasseB.Create;
Instance.TuEtwas.TuEtwasAnderes;
Dann funktioniert das nicht, da Instance zwar beide Funktionen kennt, aber wenn ich Instance.TuEtwas aufrufe, erhalte ich nur TKlasseA zurück und das kennt natürlich TuEtwasAnderes nicht...

Kann man dann also, allgemein gesprochen, Klassen mit Fluent Interface nicht vererben? Oder gibt es doch einen Trickt?

Viele Grüße
Harald
Harald
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Fluent Interface - keine Vererbung möglich?

  Alt 29. Okt 2017, 15:09
Der Begriff "Fluent Interface" war mir zwar nicht bekannt, aber nach der Betrachtung des Wikipedia-Artikels würde ich sagen, dass es nicht geht, ohne den Source Code zu ändern.

Unter Delphi könntest du dir aber ggf. mit einem class helper behelfen. Auch wenn ich class helper eher als Hack ansehe, nicht zuletzt weil man maximal einen helper pro Klasse haben kann. Außerdem kann man glaube ich keinen neuen Felder hinzufügen, nur (nicht-virtuelle) Methoden.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.889 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Fluent Interface - keine Vererbung möglich?

  Alt 29. Okt 2017, 21:39
Was du suchst ist "Koviarianz bei Rückgabetypen" - Also dass die Rückgabe von TuEtwas() in Vererbungsrichtung weiter eingeschränkt werden kann: Während TKlasseA.TueEtwas() ein TKlasseA zurückgibt könnte TKlasseB.TuEtwas() doch ein TKlasseB zurückgeben da TKlasseB doch nur eine Unterklasse von TKlasseA ist.

In Delphi leider nicht möglich
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
891 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Fluent Interface - keine Vererbung möglich?

  Alt 30. Okt 2017, 07:59
TuEtwas sieht irgendwie aus wie ein halber Konstruktor (der ja immer sich selbst zurückgibt), aber das geht auch nicht, weil ein Konstruktor eine class function ist, oder?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.889 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Fluent Interface - keine Vererbung möglich?

  Alt 30. Okt 2017, 08:29
TuEtwas() wird sich selbst zurückgeben. Ein Beispiel in der Delphi-Bibliothek ist der TStringBuilder:

Delphi-Quellcode:
myStringBuilder := TStringBuilder.Create();
try
   myStringBuilder
      .Append('Hallo Welt')
      .AppendLine()
      .Append(42)
      .Replace('Hallo', 'Tschüss')
      .AppendLine();

   someText = myStringBuilder.ToString();
finally
   myStringBuilder.Destroy();
end;
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
53 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fluent Interface - keine Vererbung möglich?

  Alt 31. Okt 2017, 18:07
Danke für Eure Antworten - Es scheint also so, dass ich mit meinen Vermutungen recht hatte, und eine Vererbung nicht möglich ist. Schade!

Aber danke für's Mitdenken!

Viele Grüße
Harald
Harald
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.889 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Fluent Interface - keine Vererbung möglich?

  Alt 31. Okt 2017, 18:28
Je nachdem was du vorhast würde ich es aber, wie vorgeschlagen, mit class helper machen. Solange man es nicht übertreibt...
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
53 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Fluent Interface - keine Vererbung möglich?

  Alt 31. Okt 2017, 18:32
Ja, danke nochmal für den Hinweis. Vielleicht sollte ich doch mal drüber nachdenken?! Ich habe die Class Helper eigentlich als "unbrauchbar" für mich eingestuft und grundsätzlich abgetan. Da man nur einen Helper verwenden kann und in größerem Code meiner Meinung nach keinen Überblick darüber behalten kann, welcher Helper denn ggf. aktiv wird, schien es mir kein brauchbares Programmiermittel und daraus resultierend kein guter Code zu sein... Aber, vielleicht sollte ich doch nochmal unvoreingenommen dran gehen?

Viele Grüße
Harald
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.889 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Fluent Interface - keine Vererbung möglich?

  Alt 31. Okt 2017, 19:11
Helper sind keine Allzweck-Waffe. Klar, für Basistypen wie String oder Integer bringt die Delphi-RTL schon einen helper mit der alles erschlagen soll. Auch für TDateTime wäre sicher einer denkbar gewesen.

Aber ansonsten sind helper mMn immer ein Ausweg wenn man damit entweder die Lesbarkeit stark verbessern kann oder einen Hack braucht (Zugriff auf protected Elemente) - Mehr nicht. Folglich fällt mir, außer dem TDateTime -Beispiel kein Fall ein wo ich wirklich einen allgemeingültigen Helper erstellt hätte - Sonst immer nur für eine Unit, meinst nur speziell für eine einzelne Methode. Deshalb finde ich das "Nur ein Helper aktiv, nicht mehrere gleichzeitig" ehrlich gesagt nicht schlimm.

Wenn ich den Quelltext vom "Delphi Fluent REST Client" richtig überflogen habe dann dreht sich da ja alles um den TRestClientRequest - Vielleicht habe ich nur zu oberflächlich geschaut, aber ich würde das dann, je nachdem was du vorhast, vielleicht sogar komplett ohne Unterklasse von TRestClientRequest sondern nur über einen class helper lösen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.476 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Fluent Interface - keine Vererbung möglich?

  Alt 31. Okt 2017, 22:47
In Delphi leider nicht möglich
Auf Interfaces umsteigen?

Also OLE-Interface, genauer IDispatch in einem Variant verpackt.
IDispatch in einem Variant, da werden Methodenaufrufe erst zur Laufzeit aufgelöst und dem Compiler ist das egal (leider auch der Codevervollständigung von Delphi).

Delphi-Quellcode:
TKlasseA = class(..., IKlasseA )
  function TuEtwas: Variant; // hier IKlasseA oder IKlasseB wenn am Anfang als TKlasseB/IKlasseB erstellt wurde
end;

TKlasseB = class(TKlasseA, IKlasseB)
  function TuEtwasAnderes: Variant; // hier IKlasseB
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf