Newsgroup: it.comp.lang.delphi
Titolo: Help Classi [principiante]

Salve a tutti.
Sto imparando il Delphi e sono ai primi passi con la programmazione oo.
Ho un problema con le classi che non capisco. So che tutto quello che č
nella parte private di una classe non č accessibile al resto del programma e
non viene ereditato (almeno credo). Allora perche' il compilatore mi compila
questo semplice codice?
Grazie
Enrico
Program Test;
{$APPTYPE CONSOLE}
Uses
  SysUtils;
Type
 TClasse1 = Class
  Public
   Topolino:Integer;
  Private
   Paperino:Integer;
 End;
 TClasse2 = Class (TClasse1)
  Public
   Pluto:Integer;
  Private
   Pippo:Integer;
 End;
Var
Alfa : TClasse1;
Beta : TClasse2;
Procedure Quiquoqua ;
Begin
Alfa.Paperino:=100; // Accedo al campo private????
End;
Begin
Alfa := Tclasse1.Create;
Beta := Tclasse2.Create;
Alfa.Topolino := 100; // OK
Beta.Paperino := 200; // ??
readln;
End.

nella parte private di una classe non è accessibile al resto del programma e

Perchè Sei all'interno della stessaq unit. I modificatori di accesso 
funzionano come ci si apetta solo fra unit diverse. Ovvero dichiarando le 
dure classi in una unit separata e usando alfa e beta in un altra unit 
Alfa.Topolino e Beta.Paperino non sarebbero state accettate dal 
compilatore.  Nella stessa unit invece la visibilità è totale
Ciao.  Angelo 
-------------------------------
Message Posted by  <dedGateway>
http://www.dedonline.com/forump

 perche' il compilatore mi compila questo semplice codice?
[cut]
L'esempio da te riportato riguarda una funzionalita/bug/non so come 
chiamarla di Delphi. Praticamente quando utilizzi una classe nella 
stessa unit dove questa e definita e possibile accedere ai suoi metodi 
e proprieta private. Questa tecnica e simile ai metodi friend del C++ 
anche se non lo e sintatticamente.
Spesso si utilizza per poter accedere alle priprieta private di una 
classe senza dover utilizzare ederidtarieta ed altre tecniche OOP.
Es.
TFakeEdit = classe (TEdit);
etc.
Sarebbe comunque da evitare.
Saluti.

Per evitare casini, ecco un estratto:
A private member is invisible outside of the unit or program where its class
is declared. In other words, a private method cannot be called from another
module, and a private field or property cannot be read or written to from
another module.
Il primo passo sarebbe un occhio alla guida in linea, non trovi?
Prova a cercare PRIVATE nella guida in linea e vedere come delphi gestisce
la visibilità.
A

 programma e non viene ereditato (almeno credo). 
E` accessibile, dall'esterno, solo a chi è "friend" di quella classe, il
che significa, in Delphi, che è dichiarato nella stessa unit.
Questa è una caratteristica che credo abbiano modificato nell'ultima
versione di Delphi e che è diversa da quella di altri linguaggi (vedi il
C++) in cui non c'è una friendship predefinita ma va dichiarata con
l'apposita clausola ("friend", appunto, in C++).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> L'esempio da te riportato riguarda una funzionalita/bug/
Non è affatto definibile come "bug", è una funzionalità ed è voluta.


 principi dell' OOP. 
Nessun principio della OOP viene leso da questa funzionalità (non mutano
nè il concetto di incapsulamento, nè quello di polimorfismo, nè quello di
ereditarietà); designare degli specificatori di visibilità
(public/private/protected) non fa parte strettamente dei fondamenti della
OOP.  L'unica incoerenza di fondo (ma che non c'entra con l'OOP, in
generale) è che uno specificatore "private" ha un senso piuttosto
intuitivo e che è normalmente inteso come il più restrittivo possibile:
privato alla classe a cui fa riferimento.  Ma se con "private" si intende
(come Borland intende), invece, visibile alla classe e alle
classi/funzioni "sibling", ovvero nella stessa unit, allora tutto rientra
nella normalità.  Basta intendersi.  A me una concezione del genere non
piace non perché violi alcuna regola della OOP, ma semplicemente perché
non corrisponde alla mia idea di "private".
Non ho molto tempo di seguire i ng, attualmente, quindi probabilmente le
mie risposte arriveranno (se arriveranno), in ritardo...
