AGB  ·  Datenschutz  ·  Impressum  







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

Konstruktor Create Virtual oder nicht?

Ein Thema von smudo · begonnen am 29. Aug 2007 · letzter Beitrag vom 23. Sep 2008
Antwort Antwort
Seite 3 von 4     123 4      
Muetze1
(Gast)

n/a Beiträge
 
#21

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 10:23
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 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;
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#22

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 10:29
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#23

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 11:20
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?
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#24

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 11:34
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#25

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 13:36
Zitat von Sidorion:
Entweder reicht eine globale Variable ...
Global nicht, auch nicht Unit-Global. Somit gibt es keine entsprechendes Pendant zur Lösung.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 15:15
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:
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#27

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 20:23
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Konstruktor Create Virtual oder nicht?

  Alt 30. Aug 2007, 20:53
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
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#29

Re: Konstruktor Create Virtual oder nicht?

  Alt 1. Sep 2007, 13:20
Ich würde schon gerne die Bedeutung von VMTCreateObject wissen. Deshalb hole ich diesen Thread mal wieder hoch.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#30

Re: Konstruktor Create Virtual oder nicht?

  Alt 2. Sep 2007, 15:01
Noch ein Versuch: Was bedeutet VMTCreateObject?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 22:23 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