Einzelnen Beitrag anzeigen

Gonzo2

Registriert seit: 4. Nov 2007
42 Beiträge
 
#11

Re: Fragen zu OOP und Klassen: published, protected, ...

  Alt 23. Nov 2007, 12:16
@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?
  Mit Zitat antworten Zitat