![]() |
Delphi-Version: XE
Generische Ableitung einer Klasse
Hallo zusammen,
wollte gerade sowas hier schreiben, nur leider klappt das nicht:
Delphi-Quellcode:
Der Cursor bleibt hinter dem T bei
TThreadedObject<T: class> = class(T)
end;
Delphi-Quellcode:
stehen und der Compiler meldet:
class(T)
Code:
Weiß jemand warum das so ist?
[DCC Fehler] ApCore.Classes.pas(68): E2021 Klassentyp erwartet
Ziel des ganzen ist es einer beliebigen Klasse eine CriticalSection samt Lock/Unlock-Methoden zu spendieren, ohne da jetzt jedes erst von der Klasse ableiten zu müssen und den kompletten Code immer wieder zu schreiben. |
AW: Generische Ableitung einer Klasse
Wie wäre es mit
Delphi-Quellcode:
? o.O
TThreadedObject<T: class> = class
end; Edit: Achso.. du meinst das anders.. Ne.. das geht nicht.. |
AW: Generische Ableitung einer Klasse
Und warum nicht? :stupid:
|
AW: Generische Ableitung einer Klasse
Wie soll man die Klasse denn programmieren?
Du kannst keine Methoden überschreiben, du weißt nicht welche Methoden/Properties/Variablen dir zur Verfügung stehen.. Du weißt gar nichts. Wie willst du denn auf dieser Grundlage eine Klasse ableiten/implementieren? |
AW: Generische Ableitung einer Klasse
Zitat:
Zitat:
|
AW: Generische Ableitung einer Klasse
Das hat doch nichts damit zu tun was er will oder braucht :roll:
Der Ansatz an sich macht (OOP-technisch) keinen Sinn. Für sowas sind Class-Helper gedacht. |
AW: Generische Ableitung einer Klasse
Zitat:
Zitat:
Delphi-Quellcode:
zu nutzen könnte man natürlich auch eine
TThreadedObject<TStringList>
Delphi-Quellcode:
schreiben. Deren Implementation wäre aber bis auf den Namen der Basisklasse identisch mit TThreadedBlubb, TThreadedBlah und TThreadedSchlock. Das schreit doch nach Generics.
TThreadedStringList = class(TStringList)
Zitat:
|
AW: Generische Ableitung einer Klasse
Zitat:
Zitat:
:arrow: Es macht keinen Unterschied ob er es will/braucht, wenn es einfach nicht geht. Zitat:
Sowas wie TThreadedObject<TStringList> ist ja durchaus machbar und gut! TThreadedBlubb, TThreadedBlah und TThreadedSchlock wäre natürlich noch ein Stück schöner, aber das schreit absolut nicht nach Generics. Für sowas sind und waren Generics nicht gedacht und es ist letztendlich einfach nicht machbar. Zitat:
Class-Helper gehen natürlich nur wenn er keine Felder hinzufügen muss. Die Dinger sind aber in manchen Situationen durchaus nützlich. Wenns für ihn mit Class-Helpern nicht geht, dann bleibt ihm nur die TThreadedObject<TStringList> Variante oder er muss von jeder Klasse in der er Critical-Sections einbauen will ableiten. |
AW: Generische Ableitung einer Klasse
Zitat:
Code:
Das lässt sich compilieren, läuft und spuckt erwartungsgemäß
#include <iostream>
#include <string> class MyClass { public: int blubb; }; class YourClass { public: std::string blah; }; template <typename T> class TThreadedObject: public T { public: TThreadedObject() { std::cout << "lock" << std::endl; }; ~TThreadedObject() { std::cout << "unlock" << std::endl; }; }; int main() { TThreadedObject<MyClass> tb; TThreadedObject<YourClass> ty; tb.blubb = 42; ty.blah = "Hallo"; std::cout << tb.blubb << std::endl; std::cout << ty.blah << std::endl; }
Code:
aus. Ich denke, das ist vom Prinzip her, das was der OP gerne hätte. So eine Art Mixin.
lock
lock 42 Hallo unlock unlock |
AW: Generische Ableitung einer Klasse
Hm, okay... Habe nun wohl langsam verstanden, warum ich das nicht machen kann bzw. der Compiler sich bei sowas quer stellt. Interessant wäre es aber trotzdem gewesen.
Class Helpers können wahrlich ganz schön sein, aber kann man das hier überhaupt anwendbar? Habe noch nie versucht neue Felder einzuführen -- wurde ja erwähnt, dass dies nicht möglich sei. |
AW: Generische Ableitung einer Klasse
Ein Template, wie Uli es gebaut hat, geht auch ohne weiteres in Delphi. Das hat aber noch lange nix mit Generics zu tun, nur weil Generics mithilfe von Templates implementiert sind.
![]() |
AW: Generische Ableitung einer Klasse
Zitat:
Delphi-Quellcode:
Das kannst du dann so aufrufen:
interface
type ICursorGuard = interface end; function GuardCursor(NewCursor: TCursor = crHourGlass): ICursorGuard; implementation type TCursorGuard = class(TInterfacedObject, ICursorGuard) private FOldCursor: TCursor; public constructor Create(NewCursor: TCursor); destructor Destroy; override; end; { TCursorGuard } constructor TCursorGuard.Create(NewCursor: TCursor); begin inherited Create; FOldCursor := Screen.Cursor; Screen.Cursor := NewCursor; end; destructor TCursorGuard.Destroy; begin Screen.Cursor := FOldCursor; inherited Destroy; end; function GuardCursor(NewCursor: TCursor = crHourGlass): ICursorGuard; begin Result := TCursorGuard.Create(NewCursor); end;
Delphi-Quellcode:
procedure Test;
var Guard: ICursorGuard; begin Guard := GuardCursor; //Mach was langwieriges end; // oder sogar so: procedure Test; begin GuardCursor; //Mach was langwieriges end; |
AW: Generische Ableitung einer Klasse
@uligerhardt
nett .... :-D |
AW: Generische Ableitung einer Klasse
Ich hätte noch ne schmutzige Variante:
Man könnte doch über ein Map (zB eine Hashmap) Objektzeigern eine Critical Section zuordnen und dann lock und unlock doch über Class Helper einführen (Die Map sollte dann ihre eigene Critical Section haben bzw. Thread-safe sein.) :freak: |
AW: Generische Ableitung einer Klasse
@BUG: Die Idee hatte ich auch schon. Allerdings wird es dann dahingehend unschön, dass das mit der Freigabe dann so eine Sache wird. Wobei... eigentlich könnte man sowas schon machen, aber es werden am laufenden Band CriticalSections erzeugt, was dann wiederrum nicht so schön ist. Ich glaube ich bleibe bei meinen einzelnen Ableitungen :stupid:
|
AW: Generische Ableitung einer Klasse
Habe selbst maximal D2007 (auf einem anderen Arbeitsplatz) gibt es mittlerweile in fortschrittlicheren Delphiversionen so perverses zeug wie "Aspekte"? Und wäre das dann eine Lösung ?
|
AW: Generische Ableitung einer Klasse
Zitat:
|
AW: Generische Ableitung einer Klasse
Dann hätte er es mit Delphi Prism hinbekommen können, oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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