AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen-Konstruktion einmal anders...

Ein Thema von Ganymed · begonnen am 11. Jun 2003 · letzter Beitrag vom 31. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
Ganymed

Registriert seit: 11. Jun 2003
Ort: Hameln
56 Beiträge
 
Delphi 7 Architect
 
#1

Klassen-Konstruktion einmal anders...

  Alt 11. Jun 2003, 07:44
Hi!

Ich bae ein paar Klassen, sagen wir mal
Code:
type
  TMyCustomClass = class(TObject);
  [...]
  TMyClassA = class(TMyCustomClass);
  [...]
  TMyClassB = class(TMyCustomClass);
Von TClassA und TClassB möchte ich nun einige Instanzen in einem Array verwalten:
Code:
aMyObjects: array of TMyCustomClass;
Dazu soll mit aber eine einzelne Prozedur dienen, der ich nur den Classen-Typ übergebe. Das müsste in etwa so ausssehen:
Code:
procedure AddObject(ObjectClass: TClass);
begin
  SetLength(aMyObjects, Length(aMyObjects) +1);
  aMyObjects[Length(aMyObjects) -1] := TMyCustomClass(ObjectClass).Create;
end;
Dass das nicht funktioniert ist ja klar, denn ich versuche eine TClass in eine TMyCumstomClass umzuwandeln und das kann ja nicht gehen.
Wie kann ich es aber erreichen, dass ich der Prozedur die Klasse übergebe, die ich erstellen möchte?

Hoffe, ich hab meine Problematik halbwegs nachvollziehbar dargestellt.

Ganymed

[Edit=Sakura]BBCode zugelassen[/Edit]
  Mit Zitat antworten Zitat
Ganymed

Registriert seit: 11. Jun 2003
Ort: Hameln
56 Beiträge
 
Delphi 7 Architect
 
#2
  Alt 11. Jun 2003, 07:56
Hat sich erledigt
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 11. Jun 2003, 08:04
Hi,

erst einmal herzlich willkommen in der Delphi-PRAXiS.

Darf ich Dich noch um einen kleinen Gefallen bitten. Würdest Du Deine Lösung bitte kurz umschreiben, vielleicht hilft es ja mal jemanden, der auf die gleichen Sorgen stößt.

Danke,
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#4
  Alt 11. Jun 2003, 08:15
Ganz einfach mit einem direkten aufruf von:
ObjectClass.Create
Manuel Pöter
  Mit Zitat antworten Zitat
Benutzerbild von maynard
maynard

Registriert seit: 22. Jun 2004
Ort: Deutschland
72 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Klassen-Konstruktion einmal anders...

  Alt 30. Aug 2004, 16:53
Tach...

Ich habe gerade ein ähnliches Problem. Ich möchte verschieden Exceptions in einer TList speichern und diese dann bei Bedarf auslösen. Allerdings habe ich das kurze statement von Motzi nicht so ganz verstanden und weis nicht, wie ich aus einer Klassenreferenz eine gültige Instanz erzeugen kann?!?!
"Denkst Du dasselbe wie ich, Pinky?" - "Ich glaube schon, Brain, aber was ist, wenn das Huhn die Strumpfhosen nicht anziehen will...?"
http://www.programmierer-board.de/ph...fc628a1239.jpg
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Klassen-Konstruktion einmal anders...

  Alt 30. Aug 2004, 17:18
Zitat von maynard:
... Allerdings habe ich das kurze statement von Motzi nicht so ganz verstanden und weis nicht, wie ich aus einer Klassenreferenz eine gültige Instanz erzeugen kann?!?!
Ganz einfach eigentlich, du benutzt die klassenReferenz so wie du sonst den klassen-identifier benutzen würdest, vorausgesetzt du du hast vorher den richtigen typ angelegt:

Delphi-Quellcode:
 type
  TExceptClass = class of exception;

var
  exceptClass:TExceptClass;

..
exceptClass := TDeineExceptKlasse_irgendeine;
..
raise exceptClass.create('Fieser fehler');
Finde solche lösungen sehr schön. Grade beim abstrahieren von systemen ist das sehr nützlich
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von maynard
maynard

Registriert seit: 22. Jun 2004
Ort: Deutschland
72 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Klassen-Konstruktion einmal anders...

  Alt 31. Aug 2004, 00:27
Tach...

Zuerstmal Danke für deine Hilfe, allerdings weiß ich noch nicht alles was ich wissen muß
Rein theoretisch müsste man dann in einer Klassenreferenz wie

Code:
TCustomExceptionReference = class of Exception;
auch Referenzen auf Derivate von Exception speichern können? Wenn ja, wäre auch eine Zuweisung ala

Code:
MyClassReference: TClass;
MyCustomExceptionReference: TCustomExceptionReference;
// ...
MyClassReference := MyCustomExceptionReferenc;
möglich.

Leider hab ich mit RTTI - Geschichten wenig Erfahrung, daher ist mir mir die Zuweisung etwas unklar:

Code:
MyCustomExceptionReference: TCustomExceptionReference;
// ...
MyCustomExceptionReference := @Exception;
// oder
MyCustomExceptionReference := Exception;
"Denkst Du dasselbe wie ich, Pinky?" - "Ich glaube schon, Brain, aber was ist, wenn das Huhn die Strumpfhosen nicht anziehen will...?"
http://www.programmierer-board.de/ph...fc628a1239.jpg
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Klassen-Konstruktion einmal anders...

  Alt 31. Aug 2004, 09:16
Zitat von maynard:
Tach...

Leider hab ich mit RTTI - Geschichten wenig Erfahrung, daher ist mir mir die Zuweisung etwas unklar:

Code:
MyCustomExceptionReference: TCustomExceptionReference;
// ...
MyCustomExceptionReference := @Exception;
// oder
MyCustomExceptionReference := Exception;
Mit RTTI hat das nicht viel zu tun. Das nennt man imo MetaKlassen und deine zuweisung ohne das @ ist korrekt. Wie zu erwarten sind klassen refernezen auch nur pointer, die für kompatible klasse auch zuweisungskompatible sind - also alle ableitung, von der basis-deklaration.

So, und da das pointer sind kannst du die referenzen auch ganz normal in einer liste verwalten:
Delphi-Quellcode:
type
  TCustomExceptionReference = class of Exception;
...
var l:Tlist;

l.add(Exception);
l.add(EMyException);
...
// beim rausholen musst du dann casten
raise EMyException(l[1]).create('böser fehler');
wobei die frage wäre ob das sinn macht, da so die klassen ziemlich undifferenzierbar in der liste rum wabern. Eine stringliste macht da schon mehr sinn...ich weiss ja nicht was du vor hast?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Benutzerbild von maynard
maynard

Registriert seit: 22. Jun 2004
Ort: Deutschland
72 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Klassen-Konstruktion einmal anders...

  Alt 31. Aug 2004, 12:21
Tach..

Zitat von maximov:
Mit RTTI hat das nicht viel zu tun.
Dachte, dass fällt unter den Überbegriff RTTI, Metaklasse klingt allerdings plausibler ... Hamma wieder was gelernt

Zitat von maximov:
// beim rausholen musst du dann casten
Zitat von maximov:
Code:
type
  TExceptClass = class of exception;

var
  exceptClass:TExceptClass;

..
exceptClass := TDeineExceptKlasse_irgendeine;
..
raise exceptClass.create('Fieser fehler');
Habe noch keinen Weg probiert, bei der ersten Variante kommst du allerdings ohne cast aus
"Denkst Du dasselbe wie ich, Pinky?" - "Ich glaube schon, Brain, aber was ist, wenn das Huhn die Strumpfhosen nicht anziehen will...?"
http://www.programmierer-board.de/ph...fc628a1239.jpg
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Klassen-Konstruktion einmal anders...

  Alt 31. Aug 2004, 12:57
Zitat von maynard:
Tach..
...

Habe noch keinen Weg probiert, bei der ersten Variante kommst du allerdings ohne cast aus
Na dann wird es mal zeit das du das einfach mal testest! Bei ersterer variante hab ich ja auch eine typisierte klassenvariable und bei der liste natürlich nicht, da sie ja nur aus pointern besteht.

Macht aber keinen sinn stundenlang drüber zu reden, wenn du nicht sagst was genau du vor hast. Denn meist gibt es einen eleganteren weg!
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:24 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