Newsgroup: it.comp.lang.delphi
Titolo: Lettura da Classe Ereditata

Non ho ben chiaro il meccanisco della visibilita delle variabili
nelle Classi ereditate:
un esempio banale:
data una Classe TVeicolo, che sia necessario estendere per
ulteriori informazioni, senza toccare la classe di origine;
l'idea e' creare una classe discendente da TVeicolo
il metodo GetrVeicolo di TVeicolo e' virtual, cosi' posso ridefinirlo nella
classe discendente TMdelloVeicolo
per testare creo le classi, assegno i valori a TVeicolo ed ottengo cio' che
ho passato
il punto e' questo:
i valori di TVeicolo sono assegnati sMarca = Fiat  e iAnni =1967
leggendo dal metodo GetVeicolo ereditato da TVeicolo, mi aspetteri
di trovare i valori sMarca e iAnni assegnati, ed invece cosi' non e'
sMarca='' e iAnni=0
se potete, aiutatemi a capire dov'e' l'errore di concetto.
grazie
//chiamata test
var TipoVeicolo: TModelloVeicolo;
    Veicolo : TVeicolo;
  //crea la classe
  Veicolo := TVeicolo.Create;
 //assegna i valori
  Veicolo.SetAnni('Fiat', 1967);
   //crea la classe
  TipoVeicolo := TModelloVeicolo.Create;
  TipoVeicolo.TipoV('Trattore');
  //interroga GetVeicolo ereditato
  Esito.Caption := TipoVeicolo.GetVeicolo;
  //distrugge le classi
  FreeAndNil(TipoVeicolo);
  FreeAndNil(Veicolo);
//classi TVeicolo e TModelloVeicolo
interface
type TVeicolo = class
  private
    sMarca : string;
    iAnni : integer;
  public
    procedure SetAnni(sNome: string; iAnnoImm: integer);
    function GetVeicolo : string; virtual;
end;
type TModelloVeicolo = class(TVeicolo)
  private
    sTipoVeicolo : string;
  public
    procedure TipoV(sTipo: string);
    function GetVeicolo : string; override;
end;
implementation
{ TVeicolo }
function TVeicolo.GetVeicolo: string;
var Anno, mese, giorno: word;
    Data : TDateTime;
begin
  DecodeDate(Date, Anno, Mese, Giorno);
  iAnni := Anno - iAnni;
  Result := sMarca + ' ' + IntToStr(iAnni);
end;
procedure TVeicolo.SetAnni(sNome : string; iAnnoImm: integer);
begin
  iAnni := iAnnoImm;
  sMarca := sNome;
end;
{ TModelloVeicolo }
//metodo ridefinito
function TModelloVeicolo.GetVeicolo: string;
begin
  Result := sMarca + sTipoVeicolo + IntToStr(iAnni);
end;
procedure TModelloVeicolo.TipoV(sTipo: string);
begin
  sTipoVeicolo := sTipo;
end;
end. 

 grazie
La tua implementazione, cosï¿œ a prima vista, mi sembra corretta.
Il problema ï¿œ che tu crei due oggetti nel tuo test, fai le assegnazioni 
sul primo di questi e poi vai a verificare i valori sul secondo, quindi 
ï¿œ normale che non ti ritrovi le assegnazioni fatte poco prima, che sono 
state immagazzinate nel primo oggetto, non nel secondo.
Probabilmente, si tratta di una semplice svista. :)
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 type TVeicolo = class
   private
     sMarca : string;
     iAnni : integer;
   public
     function GetVeicolo : string; virtual;
    constructor Create(const AMarca: string; const AAnno: integer);
    property Marca: stiring read  sMarca;
    property Anni: integer read iAnni;
   end;
 implementation
 { TVeicolo }
 constructor TVeicolo.Create( const AMarca: string; const AAnno:
integer);
 begin
  inherited Create;
   iAnni := AAnno;
   sMarca := AMarca;
 end;


Sorry: ho dimenticato un pezzo...
Invece di usare il metodo SetAnno (il cui nome è fuorviante in quando
non setta solo quello ma anche la marca....) puoi usare un costruttore
definito da te al quale passi i 2 parametri richiesti.
Poi, aggiungo per comodita' due property a sola lettura per rendere
tali vlaori leggibili dall'esterno.
A.

Stefano ha scritto:
<CUT>
In base a quello che ha scritto Alberto, la nuova classe ereditada 
potrebbe essere:
type TModelloVeicolo = class(TVeicolo)
   private
     ....
   public
     constructor Create(Owner:TVeicolo);
end;
constructor TModelloVeicolo.Create(Owner: TVeicolo);
begin
   inherited Create(Owner.sMarca,Owner.iAnni) ;
end;
// procedura di test
var TipoVeicolo: TModelloVeicolo;
     Veicolo : TVeicolo;
begin
   //crea la classe e assegna valori
   Veicolo := TVeicolo.Create('Fiat', 1967);
    //crea la classe con il suo papa
   TipoVeicolo := TModelloVeicolo.Create(Veicolo);
   .......
   //distrugge le classi
   FreeAndNil(TipoVeicolo);
   FreeAndNil(Veicolo);
end;
Non l'ho testata, ma "dovrebbe" funzionare.
^_Goblin_^
-- 
Ibis et redibis non morieris in bello
http://goblinland.myminicity.com/

>     constructor Create(Owner:TVeicolo);
ecco questa era la strada giusta ...... se non ho capito male
- creo un costruttore che si riferisce alla classe padre,
- potro' leggere i dati gia' assegnati tramite la sua istanza (Owner)
grazie a tutti
Stefano.