Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Meine Probleme mit Delphi-OOP ...

  Alt 22. Feb 2012, 18:09
Zum Virtuellen Konstruktor
Also dass mein eigens entwickelter Konstruktor nicht aufgerufen wird, halte ich fuer unwahrscheinlich. Ich rufe ihn ja selbst explizit auf.
Jede Komponente kann aber auch von der VCL erzeugt werden.
Dieser Weg wird in der Praxis weit häufiger benützt als das explizite Aufrufen des Konstruktors.
Jedes Label, Editfeld, Menü,... wird ja normalerweise unter Zuhilfenahme der DFM-Datei dynamisch zur Laufzeit erzeugt.
Genau aus diesem Grund wurde ja für Komponenten ein virtueller (Standard-)Konstruktor eingeführt.
Wenn deine Komponente eine weiteren Konstruktor hat, dann wird dieser von der VCL ignoriert.
Daraus kann man nur die Schlussfolgerung ziehen, dass es einfacher und sicherer ist Parameter nicht über den Konstruktor sondern über Properties dem Objekt bekannt zu machen.
Delphi-Quellcode:
// Negativbeispiel
TDoppeltGemoppelt = class(TBasisComponent)
private
  FAnzahl : integer;
public
  // virtueller Standard Konstruktor
  constructor Create(AOwner:TComnponent); override;

  // nicht-standard Konstruktor
  constructor Create(anzahl:integer);
published
  property Anzahl:integer read FAnzahl write FAnzahl default 100;
end;


constructor TDoppeltGemoppelt.Create(AOwner:TComnponent); override;
begin
  inherited; // vererbten Konstruktor aufrufen
  FAnzahl := 100; // Defaultwert für property Anzahl setzen
end;

constructor TDoppeltGemoppelt.Create(anzahl:integer);
begin
  // wir müssen auf jeden Fall den Standard Konstruktor aufrufen
  // wenn das vergessen wird, gibt es Probleme
  Create(nil {Owner ist hier unbekannt});
  FAnzahl := anzahl;
end;

.....

var
  a, b : TDoppelGemoppelt;
begin
  a := TDoppelGemoppelt.Create(42);

  b:= TDoppelGemoppelt.Create(nil);
  b.Anzahl := 42;
Um das Objekt "b" zu initialisieren benötigt man eine Zeile mehr als für Objekt "a".
Wenn aber der eigene Konstruktor so wenig Zusatznutzen bringt ist es besser ihn ganz weg zu lassen und immer nur mit dem Standard Konstruktor und Properties zu arbeiten.

Komponenten in Delphi sind in der Hinsicht genau gleich wie JavaBeans.
Andreas
  Mit Zitat antworten Zitat