Autor Beitrag
michaelarban
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Fr 16.04.10 13:21 
hallo,

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

ein ganz einfaches Beispiel zur Verdeutlichung

ausblenden 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:


ausblenden 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


Zuletzt bearbeitet von michaelarban am Fr 16.04.10 13:28, insgesamt 1-mal bearbeitet
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Fr 16.04.10 13:24 
Na Fpriv ?!
btw: mach vor den Quelltext [ delphi ] und dahinter [ /delphi ] ohne leerzeichen dazwischen
michaelarban Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. ;-)

_________________
We are, we were and will not be.
michaelarban Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. ;-)

_________________
We are, we were and will not be.
CarstenB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7, FreeBSD
Delphi 2007 Prof., VS 2003
BeitragVerfasst: 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".

www.delphi-treff.de/...zugriff-auf-objekte/
michaelarban Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. ;-)

_________________
We are, we were and will not be.
acadam71
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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