Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - private Variable: vererbbar???


michaelarban - Fr 16.04.10 13:21
Titel: private Variable: vererbbar???
hallo,

ich dachte immer, private Variablen seien nicht vererbbar an Unterklassen, die sich in anderen Units befinden:

ein ganz einfaches Beispiel zur Verdeutlichung


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
unit Oberklasse;

interface
type
  TOberKlasse = class
  private
    Fpriv  : Integer;

   public
    function getPriv : Integer;
    procedure setPriv (pX : Integer);
  end;


implementation

{ TOberKlasse }

function TOberKlasse.getPriv: Integer;
begin
  result := Fpriv;
end;

procedure TOberKlasse.setPriv(pX: Integer);
begin
  Fpriv := pX;
end;

end.




so und jetzt eine abgeleitete Unterklasse, sie sich in einem ANDEREN Unit befindet:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
unit GanzandereUnit;
interface
uses Unitober;

type
    TUnterKlasse = class (TOberKlasse)
    public
      procedure setzen(y: Integer);
    end;

implementation

{ TUnterKlasse }

procedure TUnterKlasse.setzen(y: Integer);
begin
   setPriv(y);     //FRAGE: wieso wird das denn akzeptiert? welcher Variable wird denn die Zahl y zugewiesen??
end;

end.


Danke für jede antwort


thepaine91 - Fr 16.04.10 13:24

Na Fpriv ?!
btw: mach vor den Quelltext [ delphi ] und dahinter [ /delphi ] ohne leerzeichen dazwischen


michaelarban - Fr 16.04.10 13:31

aber Fpriv ist doch als privat deklariert in der BasisKlasse und ist nur dort (bzw. in der ganzen Unit, in der sie deklariert worden ist) sichtbar, oder?


Gausi - Fr 16.04.10 13:32

Privat heißt, dass du auf die Eigenschaft von außen nicht direkt zugreifen kannst. Wenn du aber in einer öffentlichen (public) Methode der Klasse auf diese private interne Variable zugreifst, passiert das natürlich auch in den Klassen, die von deiner Basisklasse abgeleitet sind.

Dass sie nur in der Klasse/Unit sichtbar ist, heißt nicht, dass es sie woanders nicht gibt. ;-)


michaelarban - Fr 16.04.10 13:35

aber Fpriv ist doch als privat deklariert in der BasisKlasse und ist nur dort (bzw. in der ganzen Unit, in der sie deklariert worden ist) sichtbar, oder?


Gausi - Fr 16.04.10 13:43

Sie ist nur dort sichtbar, ja. Aber die Methode setPriv ist eine Methode dieser Basisklasse, und die sieht auch die privaten Variablen.

Beispiel: Du hast einen verschlossenen (privaten) Raum, für den du keinen Schlüssel hast. Du kannst selber nicht reingucken, was da drin ist, und kannst auch nichts reintun. Aber der Türsteher (SetPriv) am Eingang kann das. Und wenn du dem sagst "Pack das da rein", dann macht der das auch. Es sei denn, der Türsteher überprüft dein Zeug vorher, ob das auch in den Raum darf. Und genau dafür sind solche Setter und Getter da. ;-)


CarstenB - Fr 16.04.10 13:46

Das Schlüsselwort "private" verhindert, dass du von ausserhalb die Variable verändern kannst, du rufst aber den Setter der Oberklasse auf - und der ist "public".

http://www.delphi-treff.de/sprachen/object-pascal/zugriff-auf-objekte/


michaelarban - Fr 16.04.10 13:52

ok,

ich verstehe:

die private Variable der oberklasse wird zwar an die Unterklasse weitervererbt, aber sie ist nicht sichtbar (aber trotzdem noch vorhanden).


Gausi - Fr 16.04.10 13:55

Genau. Sonst wäre das ganze Konzept der Vererbung doch etwas unstabil, wenn immer nur die Fassade weitervererbt wird, und der Kern, an dem man von außen nicht rumfummeln soll, einfach verschwindet. ;-)


acadam71 - Fr 16.04.10 23:12

Noch einen Hinweis: Bitte KEINE "Pseudo-Setter" á la Java benutzen. In Delphi gibt es Properties! Das ist eleganter.

Gruß,
Andreas