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
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
75 Beiträge
 
Delphi 12 Athens
 
#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 Schmid
  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
6.196 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)
1.115 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
6.196 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.
75 Beiträge
 
Delphi 12 Athens
 
#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 Schmid
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Fluent Interface - keine Vererbung möglich?

  Alt 1. Nov 2017, 22:34
Oder Du machst es so...:

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

TKlasseB = class(TKlasseA)
  function ToEtwasAsB : TKlasseB;
  function TuEtwasAnderes: TKlasseB;
end;
Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Fluent Interface - keine Vererbung möglich?

  Alt 1. Nov 2017, 23:47
Und dann? Nach dem ersten Aufruf von TuEtwas funktioniert das auch nicht mehr (zumindest ohne expliziten Typecast).
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 Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#9

AW: Fluent Interface - keine Vererbung möglich?

  Alt 2. Nov 2017, 08:22
Und dann? Nach dem ersten Aufruf von TuEtwas funktioniert das auch nicht mehr (zumindest ohne expliziten Typecast).
Um einen solchen Typecast zu machen, müsste man schon sicherstellen, daß die erhaltene Instanz auch vom richtigen Typ ist. Für den Fall, daß TuEtwas lediglich Self zurückgibt, ist das noch einfach. Allerdings braucht man dann auch keinen Typecast, sondern kann ebenfalls Self zurückgeben. In allen anderen Fällen ist das stark von der Implementation von TuEtwas abhängig. Insbesondere, wenn TuEtwas eine neue Instanz erzeugt, kann man nicht blind davon ausgehen, daß diese auch vom richtigen Typ ist.

In manchen Fällen wird man nicht drum herum kommen, die Funktionalität von TuEtwas zumindest leicht verändert nachzubilden. Dann kann man es aber auch gleich TuEtwas nennen und die geerbte, eigentlich nutzlose Methode gezielt verstecken.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

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 00:54 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