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 1 von 4  1 23     Letzte »    
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#1

Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 13:44
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é
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 13:52
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 13:54
Aber es geht doch auch ohne, wenn ich inherited verwende. Warum - was ist der Unterschied?
  Mit Zitat antworten Zitat
Apollonius

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

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 13:55
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.
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 DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 14:04
Hier ist das recht gut erklärt (zumindest besser, als ich das könnte):https://www.delphi-treff.de/object-p...en-ueberladen/
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von TBx (23. Mai 2017 um 16:21 Uhr) Grund: Link korrigiert
  Mit Zitat antworten Zitat
Apollonius

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

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 14:07
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.).
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
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 14:09
Ich muss mal nachfragen: Was meinst du mit MetaKlasse?
  Mit Zitat antworten Zitat
Apollonius

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

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 14:13
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.
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
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 14:32
Nach dem genauen Lesen des ersten Beitrages von Appolonius bin ich jetzt wieder runter vom Schlauch. Danke.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Konstruktor Create Virtual oder nicht?

  Alt 29. Aug 2007, 15:24
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 15:06 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