2012-12-22 3 views
16

Date un'occhiata a questa classe:Come nascondere il costruttore TObject ereditato mentre la classe ne ha sovraccaricati?

TTest = class(TObject) 
public 
    constructor Create(A:Integer);overload; 
    constructor Create(A,B:Integer);overload; 
end; 

Ora, quando si vuole utilizzare la classe:

var 
    test: TTest; 
begin 
    test:= TTest.Create; //this constructor is still visible and usable! 
end; 

Qualcuno mi può aiutare con questo costruttore nasconde?

+0

Perché vuoi? Cosa stai cercando di ottenere? –

+1

+1. Pensavo che fosse stato chiesto prima, ma l'unica domanda che ho trovato non è stata espressa * quasi * in modo succinto come questo. –

+0

@Marjan Venema: È ovvio che voglio fare una classe standard, e la mia classe non dovrebbe avere questo costruttore predefinito. – Javid

risposta

14

finché si è sovraccaricato costruttori di nome Create, non si può nascondere il senza parametri TObject costruttore quando derivante da TObject.

Questo è discusso qui: http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

Se siete disposti a mettere un altro di classe tra la classe e TObject è possibile utilizzare Andy Hausladen's trick:

TNoParameterlessContructorObject = class(TObject) 
strict private 
    constructor Create; 
end; 

TTest = class(TNoParameterlessContructorObject) 
public 
    constructor Create(A:Integer);overload; 
    constructor Create(A,B:Integer);overload; 
end; 
+0

Esiste qualcosa di speciale in Create o TObject oppure questa regola viene generalizzata a tutti i metodi con overload con lo stesso nome di metodi di base non virtuali e non sovraccaricati? –

+3

È generale. Qualsiasi metodo sovraccarico in una classe derivata (e questa è ogni classe) rende automaticamente sovraccarico anche il metodo ereditato. –

+0

@Rob Per quanto posso dire, non c'è niente di speciale sui costruttori, 'Create',' TObject'. Lo stesso comportamento può essere riprodotto con metodi ordinari. –

10

È possibile nascondere la Creazione ereditata introducendo solo una Creazione non sovraccaricata. Come avete bisogno di due sovraccarico Creare, è possibile unire in un unico coloro Creare un secondo parametro opzionale:

TTest = class(TObject) 
public 
    constructor Create(A:Integer; B: Integer = 0); 
end; 

Questo darà un avviso del compilatore, segnalando che stai nascondendo il costruttore di default senza parametri. Per sbarazzarsi di avvertimento è possibile dichiarare il costruttore nascondiglio in questo modo:

TTest = class(TObject) 
public 
    constructor Create(A:Integer; B: Integer = 0); reintroduce; 
end; 

o, se ciò non è fattibile, è possibile introdurre una classe intermedia che introduce la prima creare e poi la classe finale con il secondo sovraccaricato :

preTest = class(TObject) 
public 
    constructor Create(A:Integer); reintroduce; 
end; 

TTest = class(preTest) 
public 
    constructor Create(A,B:Integer);overload; 
end; 
+2

Ok, sono un po 'in ritardo per la discussione, ma il primo frammento di codice non causerà un avvertimento, perché 'TObject.Create' non è virtuale o dinamico. Questo è anche il motivo per cui "reintrodurre" non ha alcun effetto e non è affatto necessario. –

Problemi correlati