![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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