Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

smudo 29. Aug 2007 13:44


Konstruktor Create Virtual oder nicht?
 
Ich steh hier momentan so'n bisschen auf dem Schlauch und wollte deshalb mal meine Frage in die Runde werfen.

Ist es notwendig bzw. besser, einen Konstruktor als virtual zu deklarieren, um diesen in abgeleiteten Klassen überschreiben zu können?
Delphi-Quellcode:
classA = class(TPersistent)
  constructor Create;
end;

classB = class(ClassA)
  constructor Create;
end;
Verwende ich in den Creates des inherited, dann funtioniert das genauso, wie diese Variante:
Delphi-Quellcode:
classA = class(TPersistent)
  constructor Create; Virtual;
end;

classB = class(ClassA)
  constructor Create; Override;
end;
Was ist richtiger?

Danke
René

DeddyH 29. Aug 2007 13:52

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Delphi-Hilfe
Mit Hilfe der Direktiven virtual und dynamic können Methoden als virtuell oder dynamisch deklariert werden. Virtuelle und dynamische Methoden können im Gegensatz zu statischen Methoden in abgeleiteten Klassen überschrieben werden. Beim Aufrufen einer überschriebenen Methode bestimmt nicht der deklarierte, sondern der aktuelle Typ (also der Typ zur Laufzeit) der im Aufruf verwendeten Klassen- bzw. Objektvariable, welche Implementierung aktiviert wird.
Um eine Methode zu überschreiben, braucht sie nur mit der Direktiven override erneut deklariert zu werden. Dabei müssen Reihenfolge und Typ der Parameter sowie der Typ des Rückgabewertes (falls vorhanden) mit der Deklaration in der Vorfahrklasse übereinstimmen.

Willst Du also auch den Konstruktor der Vaterklasse aufrufen (inherited), dann ist virtual die bessere Wahl.

smudo 29. Aug 2007 13:54

Re: Konstruktor Create Virtual oder nicht?
 
Aber es geht doch auch ohne, wenn ich inherited verwende. Warum - was ist der Unterschied?

Apollonius 29. Aug 2007 13:55

Re: Konstruktor Create Virtual oder nicht?
 
Meiner Meinung nach brauchst du virtual bei Konstruktoren und Klassenmethoden nur, wenn du mit Klassenreferenztypen (Metaklassen) arbeitest, oder den Konstruktor an einer Instanz aufrufst (Instanz.create;), was ich bisher noch nie gemacht habe.

DeddyH 29. Aug 2007 14:04

Re: Konstruktor Create Virtual oder nicht?
 
Hier ist das recht gut erklärt (zumindest besser, als ich das könnte):https://www.delphi-treff.de/object-p...en-ueberladen/

Apollonius 29. Aug 2007 14:07

Re: Konstruktor Create Virtual oder nicht?
 
Ja, aber hier reden wir über Konstruktoren, und da ist ein virtual vollkommen sinnlos, wenn man keine Metaklassen verwendet (oder sie an einer Instanz aufruft, s. o.).

smudo 29. Aug 2007 14:09

Re: Konstruktor Create Virtual oder nicht?
 
Ich muss mal nachfragen: Was meinst du mit MetaKlasse?

Apollonius 29. Aug 2007 14:13

Re: Konstruktor Create Virtual oder nicht?
 
Schau mal in die Delphi-Hilfe. Code sagt mehr als tausend Worte:
Delphi-Quellcode:
type TMetaclass=class of TMyClass; //Deklaration des Metaklassentyps
var metaklasse: TMetaclass;
begin
metaklasse:=TMyclass;
metaklasse:=TMyDerivedClass;
metaklasse:=TObject; //geht nicht, da nicht von TMyClass abgeleitet
metaklasse.statischeMethode;
end.
Nur für solche Situationen brauchst du virtuelle Klassenmethoden, denn sonst rufst du sie ja direkt an der Klasse auf, sodass keine späte Bindung nötig ist.

smudo 29. Aug 2007 14:32

Re: Konstruktor Create Virtual oder nicht?
 
Nach dem genauen Lesen des ersten Beitrages von Appolonius bin ich jetzt wieder runter vom Schlauch. Danke.

Muetze1 29. Aug 2007 15:24

Re: Konstruktor Create Virtual oder nicht?
 
Zitat:

Zitat von Apollonius
Meiner Meinung nach brauchst du virtual bei Konstruktoren und Klassenmethoden nur, wenn du mit Klassenreferenztypen (Metaklassen) arbeitest, oder den Konstruktor an einer Instanz aufrufst (Instanz.create;), was ich bisher noch nie gemacht habe.

Nein, die brauchen keinen virtuellen Konstruktor, die gehen auch mit komplett nicht virtuellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.
Seite 1 von 4  1 23     Letzte »    

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