Newsgroup: it.comp.lang.delphi
Titolo: CLASSI E OGGETTI

Ciao Ragazzi , ho bisogno del vostro aiuto per risolvere il mio problema :
- Ho una classe supponiamo "Figura Geometrica " che ha la proprietą
CalcolaArea
 definita come virtual . Ho la necessita di creare due sottoclassi
"Quadrato" e "Rettangolo" che derivano da "Figura Geometrica". La classe
quadrato deve avere il
metodo CalcolaArea dato dal "l*l" mentro la classe Rettangolo deve avere il
metodo CalcolaArea dato da "l*h/2".. come faccio a fare questo ?
Grazie in anticipo
Nicola

 questo ?
Scusa, ma da quando in qua la'era di un rettangolo si calcola l*h/2?
Quadrato: A=L*L; A=L^2
Rettangolo: A=L*H
Triangolo: A=B*H/2
-- 
I'am what I'am, I do what I can

il "questo" cosa sarebbe, scusami?
Hai il metovo virtual nella classe genitrice, e fai l'override su quelle che
ereditano da essa.
Oppure ho capito male?
A

Ho fatto un esempio dai ?..
"Setec Astronomy" <setec@_NO_NOSPAM_freemail.it> ha scritto nel messaggio
news:AniDb.190710$e6.71...@twister2.libero.it...


 ha scritto nel messaggio
news:brkbrh$15i2$1...@newsreader1.mclink.it...



Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

Grazie davvero tanto..
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:UEiDb.214340$hV.83...@news2.tin.it...


come faccio a fare questo ?
E' piuttosto banale:
type
  TFiguraGeometrica = class
  private
    FBase: Double;
    FAltezza: Double;
  protected
    procedure SetBase(const V: Double); virtual; abstract;
    procedure SetAltezza(const V: Double); virtual; abstract;
  public
    property Base: Double read FBase write SetBase;
    property Altezza: Double read FAltezza write SetAltezza;
    function CalcolaArea: Double; virtual; abstract;
  end;
  TTriangolo = class(TFiguraGeometrica)
  protected
    procedure SetBase(const V: Double); override;
    procedure SetAltezza(const V: Double); override;
  public
    property Base: Double read FBase write SetBase;
    property Altezza: Double read FAltezza write SetAltezza;
    function CalcolaArea: Double; override;
  end;
  TQuadrato = class(TFiguraGeometrica)
  protected
    procedure SetBase(const V: Double); override;
    procedure SetAltezza(const V: Double); override;
  public
    property Base: Double read FBase write SetBase;
    property Altezza: Double read FAltezza write SetAltezza;
    function CalcolaArea: Double; override;
  end;
  TRettangolo = class(TFiguraGeometrica)
  protected
    procedure SetBase(const V: Double); override;
    procedure SetAltezza(const V: Double); override;
  public
    property Base: Double read FBase write SetBase;
    property Altezza: Double read FAltezza write SetAltezza;
    function CalcolaArea: Double; override;
  end;
  procedure TTriangolo.SetBase;
  begin
    if V > 0 then FBase := V;
  end;
  procedure TTriangolo.SetAltezza;
  begin
    if V > 0 then FAltezza := V;
  end;
  function TTriangolo.CalcolaArea;
  begin
    Result := FBase * FAltezza / 2;
  end;
  procedure TQuadrato.SetBase;
  begin
    if V > 0 then
    begin
      FBase := V;
      FAltezza := FBase;
    end;
  end;
  procedure TQuadrato.SetAltezza;
  begin
    if V > 0 then
    begin
      FAltezza := V;
      FBase := FAltezza;
    end;
  end;
  function TQuadrato.CalcolaArea;
  begin
    Result := FBase * FAltezza;
  end;
  procedure TRettangolo.SetBase;
  begin
    if V > 0 then FBase := V;
  end;
  procedure TRettangolo.SetAltezza;
  begin
    if V > 0 then FAltezza := V;
  end;
  function TRettangolo.CalcolaArea;
  begin
    Result := FBase * FAltezza;
  end;
  procedure CalcolaArea(const P: TFiguraGeometrica);
  begin
    ShowMessageFmt('%f', [P.CalcolaArea]);
  end;
procedure TForm1.Button1Click(Sender: TObject);
var
  Q: TQuadrato;
  T: TTriangolo;
  R: TRettangolo;
begin
  Q := TQuadrato.Create;
  T := TTriangolo.Create;
  R := TRettangolo.Create;
  try
    Q.Base := 5;
    Q.Altezza := 7;
    CalcolaArea(Q);  // 7 * 7
    T.Base := 5;
    T.Altezza := 7;
    CalcolaArea(T);  // 5 * 7 / 2
    R.Base := 5;
    R.Altezza := 7;
    CalcolaArea(R);  // 5 * 7
  finally
    FreeAndNil(Q);
    FreeAndNil(T);
    FreeAndNil(R);
  end;
end;
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Il problema è che ora mi da ABSTRACT ERROR
"Marco Breveglieri" <ma...@NOSPAMabls.it> ha scritto nel messaggio
news:UEiDb.214340$hV.83...@news2.tin.it...


 Il problema č che ora mi da ABSTRACT ERROR
"Affermazione prevedibile"... ;-)
Seguendo il mio esempio, probabilmente hai creato direttamente
un'istanza di TFigura e stai cercando di richiamare il metodo
CalcolaArea, oppure hai dimenticato di indicare "override" dopo la
dichiarazione del metodo nelle classi discendenti.
Se non ricordo male, il compilatore dovrebbe restituirti un warning in
entrambi i casi che ho citato.
Ad ogni modo, riporta il codice che provoca l'errore cosě verifichiamo.
P.S.:
attenzione alla quotatura: non riportare l'intero messaggio se non č
necessario.


Ho fatto un esempio dai ?..
Compito in classe domani ?
 ;-)
-- 
Morde. 
(
mo...@despammed.com
)

  ;-)
Bei tempi quelli, io li facevo con la carta carbone, in triplice copia,
4 versioni diverse per tutta la classe.


4 versioni diverse per tutta la classe.
Setec.... eh eh ....sbaglio o eri il secchione della classe !? 
Io invece venni bocciato due volte, ricattavo i primini e organizzavo i
picchetti per gli scioperi, bah... erano tempi davveri bui per il mio
cervelletto!
Ho rimediato con le serali, 56/60 studiando tutte le notti per 2
anni...fabbrica di giorno banchi di scuola alla sera...  se torno indietro col
ca##o che mi faccio bocciare per condotta e lazzaronismo!
-- 
Morde. 
(
mo...@despammed.com
)

 lazzaronismo!
ROTFL
Saluti ;)


casi della vita)
Io facevo ITIS - perito informatico: durante le verifiche di laboratorio
ordinavo ai secchioni piu' deboli di passarmi i sorgenti pascal delle
verifiche... solo che l'assistente teneva d'occhio il  mio terminale e mi
cattava sempre... voto: 4.
eravamo in lan unix e, guarda caso, le verifiche si facevano in pascal...
Ciao!
-- 
Morde. 
(
mo...@despammed.com
)

ok. lo dichiari ABSTRACT oltre che virtual.
In questo modo se una classe che eredita dalla genitrice non fa 
l'override del metodo, avrai un abstract error a runtime in quanto la 
classe figlia tenta di usare il metodo della genitrice che è astratto e 
non puo' essere richiamato.
A