Zitat von
dominik.boehm:
Oh jee...
Schön ist das wirklich nicht. Wenn ich mir vorstelle, diesen Ansatz für mehr als 2 Klassen zu machen, dann habe ich ne Menge Compiler-Direktiven dadrin. Gefällt mir so gar nicht
Mehr Compiler-Direktiven als Code?
Meine persönliche Einschätzung, auch in Bezug auf die Einleitung des Artikels, des Dingens ist, daß es eher eine Spielerei ist. Er ist Delphi-Fanatiker und hatte keinen Bock mehr, von C++lern ausgelacht zu werden, und deswegen hat er sich so einen Code zusammengeschustert. Wahrscheinlich ist er auch einer derjenigen, die immer behaupten, Delphi sei soooo cool, weil der Code viel übersichtlicher und lesbarer ist als der von C++. IMAO nicht sonderlich ernst zu nehmen, auch wenn er wohl so masochistisch ist, und sowas in Produktivcode einsetzt.
Zitat von
dominik.boehm:
Und ich kann mich immernoch nicht mit Templates anfreunden...
Eigentlich ganz nette Freunde, wenn man sich mit ihnen ein Weilchen beschäftigt. Ich finde sie einfach praktisch, wenn es darum geht, irgendwelche Algorithmen oder Strukturen wirklich type-safe zu implementieren. Nie wieder typecasten
Aber sicherlich Gewöhnungssache.
Zitat von
dominik.boehm:
Zitat von
tommie-lie:
Aber eine ganz andere Sache: Wie willst du bei 5 verschiedenen Singleton-Nachfahren jeweils eine Instanz ermöglichen?
Ganz genau hier habe ich auch mein Problem gesehen. Leider kann Delphi nur Klassenfunktionen, aber keine Klassenvariablen.
Puh, dann hat mich mein Gedächtnis doch nicht getrügt und ich habe doch nicht ein wichtiges Feature von Delphi verpasst
Zitat von
dominik.boehm:
Endlich mal etwas, wo ich Java besser finde
Oder C++
Zitat von
dominik.boehm:
Naja - ich habe jetzt auf jeden Fall für alle Klassen eine eigene Singleton-Implementation vorgesehen. Damit habe ich dann weniger Probleme.
Entwickelst du das Projekt mit Delphi2006? Dann könnten dir zumindest die Code Templates der
IDE ein wenig Copy&Paste-Arbeit ersparen (und das Code Template wäre wiederverwendbar und du müsstest es nicht irgendwo aus deinen alten Units rauskopieren, wenn du mal wieder mehrere Singletons brauchst).
Zitat von
dominik.boehm:
Wenn ich die Funktion overriden möchte, erhalte ich den Fehler, dass die Typen nicht zueinander kompatibel sind. Nun möchte ich aber auch nicht nur TServiceController zurückliefern, da ich dann immer casten muss... Wie mache ich das also?
Beim überschreiben von virtuellen Methoden müssen die erweiterten Signaturen der Funktionen übereinstimmen. Dazu gehört auch der Rückgabewert und der Name (ergo die gesamte Deklaration muss identisch sein).
Was mir spontan einfällt:
Delphi-Quellcode:
TAncestorSingleton = class
protected
class function _Instance(): TAncestorSingleton; virtual; abstract;
end;
TDerivedSingleton = class(TAncestorSingleton)
public
class function Instance(): TDerivedSingleton;
protected
class function _Instance(): TAncestorSingleton; virtual; override; // oder war das in Delphi ohne "virtual" bei "override"?
end;
implementation
TDerivedSingleton.Instance(): TDerivedSingleton;
begin
Result := _Instance();
// oder für die ganz ordentlichen:
// Result := TDerivedSingleton(_Instance());
end;
Auch nicht schön, aber leider das einzige, was mir einfällt. Ich habe zum Beispiel auch noch keine wirklich schicke Factory in Delphi gesehen (eine Factory für mehr als eine Klasse). Entweder die Objekte müssen sich des Patterns bewusst sein (TDerivedSingleton hat eine eigene Class Function Instance(), oder bereits der Vorfahre muss über die Nachfahren informiert sein. Über eine wirklich elegante Lösung würde ich mich auch freuen, falls jemand eine hat (gescheite Smart Pointer wären dann nur noch das i-Tüpfelchen
).