Newsgroup: it.comp.lang.delphi
Titolo: Ereditarietà: dove va dichiarata?

Mi spiego meglio:
se derivo una classe da un'altra, la dichiarazione della classe derivata la
devo mettere nella stessa Unit della classe genitrice?
Ad es. avendo la seguente Unit con la classe genitrice TComputer
unit ComputerU;
interface
uses
  Windows,  ecc..ecc..
type
  TForm1 = class(TForm)
    ....
end;
var
  Form1: TForm1;
type
TComputer = class
private
ecc. ecc.
end;
{definizioni}
begin
{codice }
end.
e poi volendo creare una classe che eredita da TComputer, ad es. TPentium3,
dove devo scrivere "type TPentium3 = class(TComputer)" ?
Lo devo fare nella stessa Unit o posso farlo in una nuova?
In questo caso devo mettere il nome della Unit ComputerU nello "uses" della
Unit nuova?
E per quanto riguarda i metodi e le variabili, li devo riscrivere anche se
non voglio modificarli?
Stefano


Puoi scrivere le tue classi discendenti nella stessa unit oppure in unit
separate a piacimento; nel secondo caso, devi aggiungere la unit contenente
la classe genitore alla clausola 'uses' nella sezione 'interface'. La
differenza tra le due soluzioni sta nel fatto che nel caso in cui le classi
siano dichiarate nella stessa unit, ciascuna classe è in grado di vedere i
campi e i metodi privati dell'altra; se le classi si trovano invece in unit
separate, la classe discendente è in grado di accedere solamente ai campi e
metodi protetti (sezione 'protected' della classe). Per quanto riguarda
l'ereditarietà dei metodi e delle variabili (campi), ti dirò brevemente che
non è necessario riscrivere ogni volta i metodi (altrimenti si perde la
potenza della programmazione ad oggetti). Inserisci nella classe base tutto
ciò che è comune a tutti i suoi discendenti, definisci i metodi e aggiungi
la clausola 'virtual' o 'dynamic' (di cui trovi spiegazione sulla Guida in
linea o sul manuale) per creare metodi che possono essere scavalcati dalle
classi discendenti tramite la clausola 'override'; nei metodi delle classi
discendenti, hai la possibilità di aggiungere le dovute specializzazioni del
caso e richiamare il metodo ereditato inserendo l'istruzione 'inherited'
nell'implementazione del metodo.
Spero di averti dato una buona dritta per raggiungere il tuo scopo, anche se
le cose da dire sarebbero molto di più. Ciao!
--
/\/\arco Breveglieri (
ma...@abls.it
)
· SINTESI S.r.l. (
www.sintesi.com
)
· ABLS Team (
www.abls.it
)

> Puoi scrivere le tue classi discendenti nella stessa unit oppure ....
Grazie Marco, mi sei stato molto di aiuto!
Perņ mi rimane un dubbio: la Unit contenente la classe genitore va salvata
in una directory particolare (la stessa della unit della classe
discendente?) oppure non ci sono particolari regole in tal senso?
Te lo chiedo perché all'atto della compilazione della Unit della classe
figlia il compilatore mi da il msg "Undeclared identifier:
NomeClasseGenitore" non appena arriva alla riga dove dichiaro la nuova
classe (e cioč "TPentium3 = class(TComputer)" dicendo appunto "Undeclared
identifier: TComputer").
Ciao
Stefano


Per risolvere il problema, controlla di aver inserito la unit contenente la
dichiarazione della classe genitore nella clausola 'uses' della unit
contenente la classe figlia, necessariamente nella sezione 'interface' di
tale unit.
Non ci sono particolari regole per la scelta delle directory; semplicemente,
quando Delphi deve rintracciare una unit, lo fa partendo dalla directory
corrente e, se non la trova, comincia a cercare all'interno delle directory
specificate nei percorsi di ricerca (Search Path, Library Path, ecc.); la
unit di cui ha bisogno deve trovarsi necessariamente in una di queste
cartelle.
Nel tuo caso, controlla attentamente il codice poichč non mi sembra un
problema di directory, altrimenti ti avrebbe indicato che il nome della unit
non esiste (perchč non riesce a reperire il file); invece, ti viene
restituito l'errore di "Undeclared Identifier", quindi magari hai scritto in
modo errato il nome di una classe.


> Per risolvere il problema, controlla ...
OK!  ;-)
Ciao
Stefano

linea o sul manuale) per creare metodi che possono essere scavalcati dalle
Attenzione al fatto che non e' necessario utilizzare per
forza "virtual" o "dynamic" perche' un metodo scavalchi
l'implementazione base.  
Le due keyword in questione vengono usate quando si vuol
conferire alle classi derivate un comportamento polimorfico.
 
E' tutto corretto cio' che dici, ma la mia e' solo una
precisazione su un concetto che non traspariva dal tuo
messaggio.
--
Andrea Laforgia - walkietalkie(at)
libero.it
#exclude <windows.h>

 ha scritto nel messaggio
news:3b4b752a...@news.libero.it...
