Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konstruktor Create Virtual oder nicht? (https://www.delphipraxis.net/98594-konstruktor-create-virtual-oder-nicht.html)

Muetze1 30. Aug 2007 10:23

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Sidorion
Insofern isses gegenüber Delphi eingeschränkter, allerdings kann ich in C++ auch Variablen static machen, was bei Rekursionen und so extrem lecker sein kann. Hier heisst das dann das diese Variable nur einmal im Programm existiert (allerdings mit den entsprechenden Scopierungen, wie Klasse, Funktion usw.).

Das klappt in Delphi auch: Lokale Konstante mit Typ definieren und in den Projekt-Optionen die veränderbare Konstanten zulassen. Das ist dann auch eine einwandfreie statische Variable.

In den neuen Delphi Versionen (afair: ab D2005) gibt es gleichfalls static Variablen - auch hier wird der Präfix "class" verwendet.

Zitat:

Zitat von BDS2006 Hilfe
Mithilfe einer class var-Deklaration können Sie einen Block von statischen Klassenfeldern innerhalb einer Klassendeklaration erzeugen. Alle nach class var deklarierten Felder haben statische Speicherattribute. Ein class var-Block wird durch Folgendes abgeschlossen:
  • Eine weitere class var-Deklaration
  • Eine Prozedur- oder Funktionsdeklaration (Methodendeklaration) (einschließlich Klassenprozeduren und Klassenfunktionen)
  • Eine Eigenschaftsdeklaration (einschließlich Klasseneigenschaften)
  • Eine Konstruktor- oder Destruktor-Deklaration
  • Ein Sichtbarkeitsattribut (public, private, protected, published, strict private und strict protected)
Ein Beispiel:
Delphi-Quellcode:
 type
   TMyClass = class
     strict private
       class var        // Felder müssen als Klassenfelder deklariert werden
          FRed: Integer;
          FGreen: Integer;
          FBlue: Integer;
       public            // Ende des class var-Blocks
          class property Red: Integer read FRed write FRed;
          class property Green: Integer read FGreen write FGreen;
          class property Blue: Integer read FBlue write FBlue;
   end;
Auf die obigen Klasseneigenschaften kann folgendermaßen zugegriffen werden:
Delphi-Quellcode:
TMyClass.Red := 0;
TMyClass.Blue := 0;
TMyClass.Green := 0;


Sidorion 30. Aug 2007 10:29

Re: Konstruktor Create Virtual oder nicht?
 
Dass der Schalter bereits ab Delphi4 (oder früher hab kein D1-D3) als veraltet gebrandmarkt und Konstanten keine Variablen sind (auch wenn man sie verändern kann) stört Dich dabei nicht? Naja meine Meinung über Compilerschaltermagie habe ich hier im Forum schon zu genüge geäußert. Dass es sowas in D2006 gibt, find ich allerdings schick.

Muetze1 30. Aug 2007 11:20

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Sidorion
Dass der Schalter bereits ab Delphi4 (oder früher hab kein D1-D3) als veraltet gebrandmarkt und Konstanten keine Variablen sind (auch wenn man sie verändern kann) stört Dich dabei nicht?

Wie sollte ich das Problem aber sonst lösen unter einem solchen Delphi wo ich die neuen Sprachfeatures noch nicht zur Verfügung habe? Den Auftrag ablehnen?

Sidorion 30. Aug 2007 11:34

Re: Konstruktor Create Virtual oder nicht?
 
Ganz ehrlich, ich bin noch nieeeee in die Verlegenheit gekommen, diesen Schalter bedienen zu müssen. Entweder reicht eine globale Variable mit dem entsprechenden Zuriffsschutz (Singelton, CriticalSection) oder das Design kann geändert werden, wobei der Zugriffsschutz müsste auch bei einer Konstante realisiert werden.

Muetze1 30. Aug 2007 13:36

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Sidorion
Entweder reicht eine globale Variable ...

Global nicht, auch nicht Unit-Global. Somit gibt es keine entsprechendes Pendant zur Lösung.

Apollonius 30. Aug 2007 15:15

Re: Konstruktor Create Virtual oder nicht?
 
Hagen, Hagen... mir musst du das mit Polymorphie, dynamisch, virtuell und und und nicht erklären...
Und ich habe es eben nochmal ausprobiert: man kriegt TSecondClass raus.
Ein Aufruf von TBaseclass.create kriegt als allerersten Parameter die Klassenreferenz mit, die in diesem Fall TSecondclass ist, und den Konstruktor haben wir beauftragt, Klassenreferenz.ClassName anzuzeigen.
WARUM IN ALLER WELT SOLLTE JETZT TBASECLASS ANGEZEIGT WERDEN? Wir haben ausdrücklich TSecondClass als Klassenreferenz übergeben, und dieser Name wird angezeigt.
Mein Testcode:
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
TMClass=class
  constructor create;
end;
TAClass=class(TMClass)
end;
TMClassClass=class of TMClass;

constructor TMClass.create;
begin
writeln(ClassName);
end;

var MClass:TMClassClass; Instanz:TMClass;
begin
MClass:=TAClass;
Instanz:=MClass.create;
Instanz.free;
readln;
end.
Zurück zum Konstruktorzeiger:
Zitat:

Delphi-Quellcode:
VMT: array[0..3] of procedure; // vmtQueryInterface, vmtAddRef, vmtRelease, vmtCreateObject <- Constructor !!

Das ist doch ein Auszug aus einer Interface-VMT? Meine Interface-Methoden beginnen bei $0C, also direkt nach QueryInterface ($00), _Addref ($04) und _Release ($08). Wäre natürlich theoretisch möglich, dass sich das mal geändert hat (ich habe Delphi 2005 Personal, also leider auch ohne Sourcecode).
[edit] Er kennt WMTCreateObject zwar, aber alle vier Interface-VMT-Konstanten sind, im Gegensatz zu den Klassen-VMT-Konstanten, als veraltet markiert.[/edit]

Dieses konstruktive Streitgespräch beginnt, mir Spaß zu machen...
Gruß
Apollonius

negaH 30. Aug 2007 20:23

Re: Konstruktor Create Virtual oder nicht?
 
Stop mal, ich kann mich auch selber austricksen.

Wo ist deine TAClass.Create ?

Also erstmal noch eine TAClass Create anlegen. In TMClass Create nun ShowMessage('1'); und in TAClass Create ShowMessage('2';

Nun MClass := TAClass; und MClass.Create;

Was zeigt er bei dir an ? '1' oder '2' ?

Nach diesem Test TMClass.Create als virtual und TAClass.Create als override; Und dann nochmal schauen was ShowMessage sagt.
Und wenn ich am Montag von meiner Dienstreise zurück bin, dann diksutieren wir nochmal was ich oben gesagt habe, ok ;)

Metaklassen -> bedingt virtuelle Konstrukoren -> damit man die Klassen individuell initialisieren kann.

Gruß Hagen

Apollonius 30. Aug 2007 20:53

Re: Konstruktor Create Virtual oder nicht?
 
Ich glaube, dass bedeutet, dass wir die ganze Zeit aneinander vorbeigeredet haben: Ich meinte, dass TBaseclass.create mit der Klassenreferenz TSecondclass aufgerufen wird, und du sagtest, dass TBaseclass.create aufgerufen wird. Das widerspricht sich wohl nicht.
Ich dachte, dass du in deinen Konstruktor ebenfalls den Classname (deshalb meine Ergänzung mit hartcodierten Namen) anzeigen ließest.

Zitat:


Wenn also BaseClass.Create() intern SchoMessage(ClassName) aufruft dann zeigt das den Klassennamen der Klasse auch an. Wenn wir in BaseClass nun TSecondClass drinen stehen haben der Konstruktor aber NICHT virtuell deklariert wurde dann wird defakto eben nich TSecondClass.Create() aufgerufen sonder TBaseClass.Create(). das ist auch logisch da der Datentyp der Variablen BaseClass: class of TBaseClass ist.
Das habe ich wohl ziemlich falsch interpretiert.

Aber zurück zu den statischen Konstruktoren - in der VMT oder nicht, das ist hier die Frage. Kannst du mir die Bedeutung von VMTCreateObject erklären, denn bei meinen eigenen Nachforschungen bin ich nicht darauf gestoßen?
Apollonius

Apollonius 1. Sep 2007 13:20

Re: Konstruktor Create Virtual oder nicht?
 
Ich würde schon gerne die Bedeutung von VMTCreateObject wissen. Deshalb hole ich diesen Thread mal wieder hoch.

Apollonius 2. Sep 2007 15:01

Re: Konstruktor Create Virtual oder nicht?
 
Noch ein Versuch: Was bedeutet VMTCreateObject?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.
Seite 3 von 4     123 4      

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