@Phoenix
Ich hab ein wenig mit deiner Klasse experimentiert. Du hast Recht, es ist so, daß die private Variable in der Nachfolgeklasse nicht angesprochen werden kann, die protected schon. Allerdings gilt das nicht wenn man die Nachfolgeklasse in der gleichen
Unit ableitet. Dann kann man auch auf die Variablen in private zugreifen. Böse Falle. Vor allem für Anfänger die dann kein Unterschied sehen. Also kann man für jeden Anfänger der üben will die goldene Regel geben:
Beim üben von Klassen, immer mit zwei Units arbeiten und den Nachfahren immer in einer zweiten extra Unit ableiten, sonst sieht man in der gleichen Unit Elemente die man eigentlich nicht sehen sollte.
Delphi-Quellcode:
//==== Unit1 ====
type
TMyClass = class
private
fCreated: TDateTime; //mal private, mal protected
protected
//fCreated: TDateTime; //mal private, mal protected
public
constructor Create();
end;
constructor TMyClass.Create();
begin
fCreated := now;
end;
Delphi-Quellcode:
//==== Unit2 ====
type
TMyClass2 = class(TMyClass)
public
constructor Create();
end;
constructor TMyClass2.Create();
begin
inherited;
//fCreated := now-1; //versuchen Wert zu ändern, mal mit private, mal protected
end;
Bei einer
Unit kann man bei der zweiten Klasse immer auf die Variable zugreifen, bei zwei Units klappt das nur bei protected.
Zitat von
Luckie:
Hm, also ich dachte, das wäre in meinem Tutorial deutlich geworden.
Ja, es ist sonderbar, aber wenn man es verstanden hat, dann ergibt Deine Beschreibung wirklich Sinn. Vorher ist aber nicht klar wie das genau gemeint ist. Für den Wissenden ist das alles logisch, für den Unwissenden etwas unklar.
Zitat von
Muetze1:
Nein, nicht explizit. Es kann published oder auch public sein!
Zitat von
Delphi Hilfe:
Ein Element ohne Attribut erhält automatisch die Sichtbarkeit des vorhergehenden Elements in der Deklaration. Die Elemente am Anfang einer Klassendeklaration ohne explizite Sichtbarkeitsangabe werden standardmäßig als published deklariert, wenn die Klasse im Status {$M+} compiliert oder von einer mit {$M+} compilierten Klasse abgeleitet wurde. Andernfalls erhalten sie das Attribut public.
Acha, das ist die Erklärung. Es ist
public, aber mit {$M+} ist es
published.
Irgendwo habe ich gelesen, daß man selbst selten den Status {$M+} setzten muß, da in der Regel schon der Vorfahr den {$M+} Status gesetzt hat und damit wären Elemente ohne Sichtbarkeitsattribute published.
Abschließend will ich nochmal kurz auf public und published eingehen und ihre Wechselwirkung mit Komponenten. Das mit der Komponente testen ist etwas schwieriger, da hier dann erst die Komponente installiert werden muß usw. Werde ich noch machen, ist aber ein etwas größerer Aufwand.
Aber kann man das jetzt so sagen, daß der einzige Unterschied ist, daß public im
OI nicht sichtbar ist und published schon. Ist das der einzige Unterschied? Oder gibt es da noch etwas mehr?