Delphi-Version: 5
Fluent Interface - keine Vererbung möglich?
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:
Wenn ich nun die KlasseB erzeuge und aufrufe, etwa so:
TKlasseA = class
function TuEtwas: TKlasseA; end; TKlasseB = class(TKlasseA) function TuEtwasAnderes: TKlasseB; end;
Delphi-Quellcode:
Dann funktioniert das nicht, da
Instance := TKlasseB.Create;
Instance.TuEtwas.TuEtwasAnderes;
Delphi-Quellcode:
zwar beide Funktionen kennt, aber wenn ich
Instance
Delphi-Quellcode:
aufrufe, erhalte ich nur TKlasseA zurück und das kennt natürlich
Instance.TuEtwas
Delphi-Quellcode:
nicht...
TuEtwasAnderes
Kann man dann also, allgemein gesprochen, Klassen mit Fluent Interface nicht vererben? Oder gibt es doch einen Trickt? Viele Grüße Harald |
AW: Fluent Interface - keine Vererbung möglich?
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
Delphi-Quellcode:
behelfen. Auch wenn ich
class helper
Delphi-Quellcode:
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.
class helper
|
AW: Fluent Interface - keine Vererbung möglich?
Was du suchst ist "Koviarianz bei Rückgabetypen" - Also dass die Rückgabe von
Delphi-Quellcode:
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.
TuEtwas()
In Delphi leider nicht möglich :( |
AW: Fluent Interface - keine Vererbung möglich?
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?
|
AW: Fluent Interface - keine Vererbung möglich?
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; |
AW: Fluent Interface - keine Vererbung möglich?
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 |
AW: Fluent Interface - keine Vererbung möglich?
Je nachdem was du vorhast würde ich es aber, wie vorgeschlagen, mit
Delphi-Quellcode:
machen. Solange man es nicht übertreibt...
class helper
|
AW: Fluent Interface - keine Vererbung möglich?
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 |
AW: Fluent Interface - keine Vererbung möglich?
Helper sind keine Allzweck-Waffe. Klar, für Basistypen wie
Delphi-Quellcode:
oder
String
Delphi-Quellcode:
bringt die Delphi-RTL schon einen helper mit der alles erschlagen soll. Auch für
Integer
Delphi-Quellcode:
wäre sicher einer denkbar gewesen.
TDateTime
Aber ansonsten sind helper mMn immer ein Ausweg wenn man damit entweder die Lesbarkeit stark verbessern kann oder einen Hack braucht (Zugriff auf
Delphi-Quellcode:
Elemente) - Mehr nicht. Folglich fällt mir, außer dem
protected
Delphi-Quellcode:
-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.
TDateTime
Wenn ich den Quelltext vom "Delphi Fluent REST Client" richtig überflogen habe dann dreht sich da ja alles um den
Delphi-Quellcode:
- 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
Delphi-Quellcode:
sondern nur über einen class helper lösen.
TRestClientRequest
|
AW: Fluent Interface - keine Vererbung möglich?
Zitat:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz