Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - PRIVATE (UDT)

Referenz-Navigation

 

Syntax:

TYPE TypeName
   PRIVATE:
   ' Deklaration privater Records

END TYPE

Typ: Schlüsselwort
Kategorie: Klassen

PRIVATE legt fest, dass die folgenden Deklarationen privat sein sollen, d. h. dass ein Zugriff nur von BefehlsreferenzeintragUDT-eigenen Prozeduren aus zulässig ist. Das Schlüsselwort ist in dieser Form nur dann zulässig, wenn mit der Kommandozeilenoption Befehlsreferenzeintrag-lang fb compiliert wurde (Standard).

Mit PRIVATE ist es möglich, den Zugriff auf UDT-Records einzuschränken. Der Zweck liegt darin, dass der Zugriff auf die entsprechenden Records nur noch über benutzerdefinierte Prozeduren ermöglicht wird, die eventuelle Fehler schon beim Zugriffsversuch abfangen, den Wert in ein besser verwertbares Format umwandeln, etc.

Der UDT wird regulär definiert. Innerhalb der Typen-Deklaration wird die Zeile

PRIVATE:

eingefügt, sobald die folgenden Records privat sein sollen, d. h. wenn der Zugriff darauf eingeschränkt werden soll. PRIVATE gilt innerhalb des UDTs so lange, bis es durch das Schlüsselwort BefehlsreferenzeintragPUBLIC oder BefehlsreferenzeintragPROTECTED abgelöst wird.
Standardmäßig sind alle Records PUBLIC. Dies ist auch dann der Fall, wenn eine vorhergehende Typendeklaration mit PRIVATE oder PROTECTED abgeschlossen wurde.

Auf PUBLIC-Records kann aus jeder Programmsituation heraus zugegriffen werden; auf PRIVATE-Records dürfen nur UDT-eigene Prozeduren (BefehlsreferenzeintragSUBs, BefehlsreferenzeintragFUNCTIONs, BefehlsreferenzeintragPROPERTYs, BefehlsreferenzeintragOPERATORs, BefehlsreferenzeintragKlassen-Konstruktoren und BefehlsreferenzeintragKlassen-Destruktoren) zugreifen. PROTECTED-Records verhalten sich wie PRIVATE-Records, jedoch können auf sie auch Prozeduren zugreifen, die sich in UDTs befinden, welche vom Basis-UDT erben (siehe BefehlsreferenzeintragEXTENDS).
Beachten Sie, dass auch die Prozeduren eines UDTs PUBLIC, PROTECTED oder PRIVATE sein können.
Ein Zugriff auf einen privaten Record von außerhalb einer UDT-eigenen Prozedur führt zu der Compiler-Fehlermeldung:
Illegal member access

Es ist erlaubt, innerhalb eines UDTs beliebig viele PUBLIC-, PRIVATE- und PROTECTED-Blöcke einzurichten.

Beispiel:

Type SecureIntArray
  Private:
  _ubound As Integer
  _lbound As Integer
  _data   As Integer Ptr

  Public:
  Declare Property datas (index As Integer ) As Integer
  Declare Property datas (index As Integer, new_value As Integer)

  Declare Sub Redim (low As Integer, up As Integer)

  Declare Constructor ()
  Declare Destructor  ()
End Type

Constructor SecureIntArray()
  With This
    ._ubound = 0
    ._lbound = 0
    ._data   = Allocate(4)
  End With
End Constructor

Destructor SecureIntArray()
  DeAllocate This._data
End Destructor

Property SecureIntArray.datas (index As Integer) As Integer
  With This
    If (index < ._lbound) Or (index > ._ubound) Then Return 0

    Return ._data[index - ._lbound]
  End With
End Property

Property SecureIntArray.datas (index As Integer, new_value As Integer)
  With This
    If (index < ._lbound) Or (index > ._ubound) Then Return

    ._data[index - ._lbound] = new_value
  End With
End Property

Sub SecureIntArray.Redim (low As Integer, up As Integer)
  If low > up Then Return

  With This
    DeAllocate ._data

    ._ubound = up
    ._lbound = low
    ._data   = Allocate( (up - low + 1) * 4 )

  End With
End Sub

Dim As SecureIntArray mySecInt
Dim As Integer i

mySecInt.Redim 0, 20             ' Wir erstellen ein Array mit den Indizes 0 bis 20...
For i = 0 To 24                  ' und versuchen, bis zum Index 24 Werte einzufügen.
  mySecInt.datas(i) = 2 * i      ' Die Property wird diesen Versuch abblocken.
Next

For i = 0 To 24                  ' Genauso, wie auch die Abfrage von Werten außerhalb der Array-Dimensionen fehlschlägt.
  Print i, mySecInt.datas(i)
Next

Sleep

' Print mySecInt._data            ' Der Pointer ist nicht verfügbar, da es sich um ein PRIVATE-Feld handelt.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
PRIVATE bei UDTs existiert seit FreeBASIC v0.17.

Siehe auch:
BefehlsreferenzeintragPRIVATE, BefehlsreferenzeintragPUBLIC (UDT), BefehlsreferenzeintragPROTECTED, BefehlsreferenzeintragTYPE (UDT), BefehlsreferenzeintragTHIS, BefehlsreferenzeintragEXTENDS, BefehlsreferenzeintragObjektorientierung


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 08.08.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 16.02.2013 von Redakteurnemored gespeichert.
  Versionen Versionen