2012-12-22 12 views
16

Spójrz w tej klasie:Jak ukryć dziedziczony konstruktor TObject, gdy klasa ma przeciążone?

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

Teraz, gdy chcemy użyć klasy:

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

Czy ktoś może mi pomóc z ukrycia tego konstruktora?

+0

Dlaczego chcesz? Co próbujesz osiągnąć? –

+1

+1. Sądziłem, że o to pytano wcześniej, ale jedyne pytanie, które znalazłem, nie zostało wyrażone * prawie * tak zwięźle jak to. –

+0

@Marjan Venema: To oczywiste, że chcę utworzyć standardową klasę, a moja klasa nie powinna mieć tego domyślnego konstruktora. – Javid

Odpowiedz

14

tak długo, jak masz przeładowany konstruktorów nazwanych Create, nie można ukryć bez parametrów TObject konstruktora podczas wyprowadzania z TObject.

to omówione poniżej: http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

Jeśli jesteś przygotowany do wprowadzenia innej klasy między klasą i TObject można użyć 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

Czy jest coś specjalnego w Create lub TObject, czy też ta reguła jest uogólniona na wszystkie przeciążone metody o tej samej nazwie, co niepokryte, nie-wirtualne metody bazowe? –

+3

Jest ogólna. Każda przeciążona metoda w klasie pochodnej (i to jest każda klasa) automatycznie powoduje przeciążenie odziedziczonej metody. –

+0

@Rob O ile mogę powiedzieć, nie ma nic szczególnego w konstruktorach, 'Create',' TObject'. To samo zachowanie można powielać zwykłymi metodami. –

10

Możesz ukryć dziedziczone tworzenie, wprowadzając nieprzeciążone Utwórz. Jak trzeba dwa przeciążone Tworzenie, można połączyć w jedno Tworzenie tych z opcjonalnym drugim parametrem:

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

To daje ostrzeżenie kompilatora, sygnalizując, że jesteś ukrywanie domyślnego konstruktora bez parametrów. Aby pozbyć się ostrzeżenia można zadeklarować konstruktor ukrycia tak:

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

lub, jeżeli nie jest to możliwe, można wprowadzić klasę pośrednią wprowadzenie utworzyć pierwszą, a następnie ostateczną klasę z przeładowanym drugim :

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

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

OK, trochę się spóźniłem na dyskusję, ale pierwszy fragment kodu nie spowoduje ostrzeżenia, ponieważ 'TObject.Create' nie jest wirtualny ani dynamiczny. Dlatego też "reintrodukcja" nie ma żadnego efektu i wcale nie jest potrzebna. –

Powiązane problemy