Kann man ein Variable einer Klasse unsichtbar machen ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von corpsman »

Morgen Allerseits,

Ich habe eine Klasse der Art :

Code: Alles auswählen

 
Type 
  TDummy = Class
  private
  public
    xyEvent:TNotifyEvent;
  end;
 
Nun will ich das eine von dieser Klasse Abgeleitete Klasse den xyEvent selbst nutzt, und er nach außen nicht mehr sichtbar ist.

Code: Alles auswählen

 
Type 
  TDummy2 = Class(TDummy)
  private
  public
    //xyEvent:TNotifyEvent; Ist nun Unsichtbar, da TDummy2 den Event selbst definiert.
  end;
 
Wenn ich nun im Code eine Instanz von TDummy2 erzeuge kann ich immer noch auf xyEvent zugreifen. Gibt es eine Möglichkeit wie ich es deklarieren kann, dass der Programmierer nen Compilerfehler kriegt wenn er auf TDummy2.xyEvent zugreifen will ?
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen[gel

Beitrag von corpsman »

Also hab da nu was, aber ob das so sauber ist.

Wenn man das ganze mittels Property in TDummy Deklariert, dann kann man in der Kind Klasse das Property überschreiben, und beim Write eine Exception werfen.

Aber ob das so die saubere Art ist ...
--
Just try it

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von Socke »

Protected?! Damit ist das Element nur in der eigenen und abgeleiteten Klassen sichtbar. Von außen kann man nur indirekt (über Methoden/Eigenschaften der Klasse) zugreifen.

Code: Alles auswählen

Type 
  TDummy = Class
  protected
    xyEvent:TNotifyEvent;
  end;
 
  TDummy2 = Class(TDummy)
  end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Soner
Beiträge: 756
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von Soner »

Benutze "protected"-Schlüsselwort.

Code: Alles auswählen

 
Type 
  TDummy = Class
  private
     //Hier nur in diese Klasse sichtbar
  protected
    //Hier nur in diese und abgeleiteten Klassen sichtbar
  public
    //Hier für alle sichtbar
  end;
 

Eclipticon
Beiträge: 292
Registriert: Sa 5. Feb 2011, 20:38
OS, Lazarus, FPC: Windows XP VirtualBox (FPC 2.6.4, Laz 1.2.4)
CPU-Target: 32Bit
Wohnort: Wien

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von Eclipticon »

Wenn ich den OP richtig verstanden habe, dann moechte er, dass die Variable in der urspuenglichen Klasse von aussen zugaenglich ist ... daher public.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen[gel

Beitrag von Socke »

corpsman hat geschrieben:Wenn man das ganze mittels Property in TDummy Deklariert, dann kann man in der Kind Klasse das Property überschreiben, und beim Write eine Exception werfen.

Aber ob das so die saubere Art ist ...
Ganz klar: Nein, da sich TDummy2 nicht mehr wie TDummy verhält.

Vgl. http://de.wikipedia.org/wiki/Liskovsche ... onsprinzip
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von corpsman »

*g*

meine ursprüngliche Intension war schon wie Eclipticon das verstanden hatte, dass sich die Kindklasse hier anders verhällt.

Das http://de.wikipedia.org/wiki/Liskovsche ... onsprinzip kenne ich so unter dem Namen zwar nicht, aber intuitiv war mir schon klar, dass es nicht ganz sauber ist, wenn die Kind Klasse etwas nicht kann, was die Elternklasse kann. Habe es nun entsprechend "Komplizierter" gelöst und die Kind Klasse so implementiert, dass sie die eigentlich unerwünschte Funktionalität der Elternklasse tollerieren kann.

Danke für die Ideen *g*
--
Just try it

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von Scotty »

Andersrum: Du kannst auf properties, die private sind per "with" zugreifen. IMHO ist das ein Bug.
http://bugs.freepascal.org/view.php?id=14534

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Kann man ein Variable einer Klasse unsichtbar machen ?

Beitrag von Socke »

Scotty hat geschrieben:Andersrum: Du kannst auf properties, die private sind per "with" zugreifen. IMHO ist das ein Bug.
http://bugs.freepascal.org/view.php?id=14534
Der Fall liegt ein wenig anders. Auf Elemente mit der Sichtbarkeit "public" kann man aus der selben Unit und der selben Klasse zugreifen (bei der Sichtbarkeit "strict private" nur aus der eigenen Klasse). Das ist so gewollt und auch dokumentiert.

In dem Bugreport wird gezeigt, dass man mit with auf die Elemente eines Records als Attribut einer Klasse schreiben kann während dies ohne with nicht möglich ist.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten