2012-12-22 77 views
16

在這個類來看看:如何在類重載時隱藏繼承的TObject構造函數?

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

現在,當我們要使用的類:

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

誰能幫我隱藏此構造?

+0

你爲什麼要?你想達到什麼目的? –

+1

+1。我以爲這已經被問過,但是我發現的唯一問題並沒有像這樣簡潔地表達*。 –

+0

@Marjan Venema:很明顯我想製作一個標準的類,而我的類不應該有這個默認的構造函數。 – Javid

回答

14

只要你重載命名Create構造函數,你不能從TObject推導時隱藏參數的構造函數TObject

這是這裏討論:http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

如果你準備把你的類之間,另一個類TObject您可以使用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

Create或TObject有什麼特別之處,或者這個規則是否推廣到所有與非重載的非虛方法相同名稱的重載方法? –

+3

這是一般性的。派生類中的任何重載方法(也就是每個類)都會自動使被繼承的方法重載。 –

+0

@Rob據我所知,構造函數沒有什麼特別的,'Create','TObject'。相同的行爲可以用普通的方法重現。 –

10

您可以通過引入非重載的Create來隱藏繼承的Create。當你需要兩個重載創建,您可以合併這些到一個創建一個可選的第二個參數:

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

這會給出一個編譯器警告,這表明你隱藏的默認參數的構造函數。爲了擺脫的警告,你可以聲明隱藏的構造函數,像這樣:

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

,或者,如果這是不可行的,你可以引入一箇中間類引入首先創建,然後最終的類重載的第二個:

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

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

好的,我討論了一下,但第一個代碼片段不會引起警告,因爲'TObject.Create'不是虛擬的或動態的。這也是爲什麼'reintroduce'沒有效果,根本不需要。 –