Newsgroup: it.comp.lang.delphi
Titolo: Aiuto: costruttori virtuali, override & co

Salve a tutti,
vi pongo un piccolo problema:
TClasseA	= class (TOBject);
	private
		...
	public
		constructor Create(a:integer); virtual;
		...
	end;
TClasseB = class(TClasseA);
	private
		...
	public
		constructor Create(a:integer; b:real);
	end;
ora il compilatore da:
<< [Warning] : Method 'Create' hides virtual method of base type 'TClasseA' >>
se metto l'override al costruttore di TClasseB:
<< [Error] : Declaration of 'Create' differs from previous declaration >>
Il problema č dovuto proprio al fatto che il costruttore in TClasseB non ha gli
stessi parametri
del costruttore virtuale (se li ha non ci sono problemi, mettendo l'override va
tutto ok) o quindi
non lo posso sovrascrivere.
Che fare?
Mi tengo il warning?
ciao e grazie dei consigli!!
Lorenzo.
-- 
Posted from 
ppp-53-6.27-151.libero.it
 [151.27.6.53] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

non lo posso sovrascrivere.
L'override deve mantenere la stessa dichiarazione del suo ascendente.
Il fatto che debba modificare la dichiarazione di un constructor
dinamico mi fa pensare che tutto sommato tu non abbia bisogno di un
costruttore di questo tipo.
Dover ridefinire un dynamic č una contraddizione di termini.
Massimo.
-----------
Ore 18.30: premo invio.

 end;
...
prova a dichiarare il costruttore della base virtual overload e quello
della figlia override overload.
Oppure, usa 2 costruttori nella figlia: uno override e overload con i
parametri della base, uno overload con tutti i parametri (che ovv.te
chiamera' l'altro)
Saluti
Paolo Arosio

 Mi tengo il warning?
e se usassi la direttiva REINTRODUCE, fatta apposta per queste situazioni?
-----------
TClasseB = class(TClasseA)
public
constructor Create(a:integer; b:real); reintroduce;
end;
------------
Mauro Falzari.
"Se guardi nell'abisso, anche l'abisso guarda in te."
(Friedrich Nietzsche)

 Dover ridefinire un dynamic è una contraddizione di termini.
Scusa ma se io creo una classe TEssereVivente e da essa derivo TCane e
TParamecio vorrei mettere in TAnimale un costruttore virtuale e poi un
opportuno
costruttore in ciascuna delle due classi. Devo dunque ridefinire il costruttore
virtuale in base alle necessità delle classe figlie che nel mio caso hanno
parametri diversi. Nella classe antenata non posso certo indicare alcun
parametro.
Che ne dici?
ciao
l.
 
-- 
Posted from 
ppp-193-206.21-151.libero.it
 [151.21.206.193] 


 e se usassi la direttiva REINTRODUCE, fatta apposta per queste situazioni?
eh si, hai proprio ragione, mi ero totalmente dimenticato di questa direttiva..
non l'avevo mai usata!
Ti ringrazio.
l.
-- 
Posted from 
ppp-193-206.21-151.libero.it
 [151.21.206.193] 


 chiamera' l'altro)
mi sa che la risposta corretta è quella datami da Mauro Falzari (vedi risposta
successiva) ma anche il tuo modo funziona, ora si tratta di fare un po' di
prove.
ciao
l.
-- 
Posted from 
ppp-193-206.21-151.libero.it
 [151.21.206.193] 


 prove.
Esatto:
dall'help di D5:
type
  T1 = class(TObject)
    procedure Test(I: Integer); overload; virtual;
  end;
  T2 = class(T1)
    procedure Test(S: string); reintroduce; overload;
  end;
   ...
  SomeObject := T2.Create;
  SomeObject.Test('Hello!');  // calls T2.Test
  SomeObject.Test(7);         // calls T1.Test
che mi pare sia quel che ti serve (semplicemente, invece di Test ci va
Create).
Saluti
Paolo Arosio