2009-07-16 77 views
1

如果兩個類都放在一個單元中 - 沒有問題,子類繼承父類的私有方法,但如果它們位於不同單元中,則該類只能訪問公共方法。爲什麼?爲什麼我的子類不會繼承父類的所有方法?

子類不能只訪問私有方法,因爲它們在不同的單元中。

我該如何避免這種情況?在我的情況下,我有3個孩子班,如果我把他們全部放在父班的單位,結果將是非常大的。

如何製作一個繼承了父類中不同單元的私有方法的子類?

謝謝!

回答

5

的私有方法是(單位)私人。你需要的是一種受保護的方法。受保護的方法可以由任何繼承自基類的類訪問,即使它們位於不同的單元中。用戶代碼不能訪問它們(除非他從類繼承)。

unit A; 

interface 

type 
    TBase = class(TObject) 
    private 
    procedure PrivateTest; 
    protected 
    procedure ProtectedTest; 
    end; 

implementation 

procedure TBase.PrivateTest; 
begin 
end; 

procedure TBase.ProtectedTest; 
begin 
end; 

end. 

unit B; 

interface 

uses 
    A; 

type 
    TDerived = class(TBase) 
    public 
    procedure Test; 
    end; 

implementation 

procedure TDerived.Test; 
begin 
    // PrivateTest; // compile error 
    ProtectedTest; // accepted by the compiler 
end; 

end. 

unit C; 

interface 

uses 
    A, B; 

implementation 

var 
    Base: TBase; 
    Derived: TDerived; 

initialization 
    Base := TBase.Create; 
    Derived := TDerived.Create; 

    // Base.PrivateTest; // compile error 
    // Base.ProtectedTest; // compile error 
    // Derived.PrivateTest; // compile error 
    // Derived.ProtectedTest; // compile error 
    Derived.Test; // accepted by the compiler 

    Derived.Free; 
    Base.Free; 
end; 
+0

從Delphi 2006開始,還有一個嚴格的修改器(比如嚴格的私有)。使用這個修飾符,私有/受保護的工作就像C++一樣(嚴格私有 - 外部沒有人可以訪問方法,嚴格保護 - 只有類和子類可以訪問方法)。 – 2009-07-16 11:00:56

2

你應該讓他們Protected,而不是Private

像這樣

type 
TMyClass = class(TObject) 
Private 
    procedure OnlyAccessedViaThisClass; 
Protected 
    procedure OnlyAccessedViaThisClassOrSubClasses; 
Public 
    procedure AccessedByAnyone; 
end; 
1

你的類不能訪問這些方法,因爲它們是私有的祖先類。您需要閱讀關於公共,私人和受保護可見性的幫助文件。重做你的課程,以便這些方法受到保護,如果你需要在後代中使用它們。

4

這是類方法範圍的遺留問題。嚴格來說,私有方法永遠不可能從其他類中看到,但Borland以他們的智慧在同一個單元內實現了這一點,可能是爲了與FORWARD聲明兼容。隨後,創建了大量利用此功能的代碼。爲了執行此操作,Delphi現在已經引入了STRICT PRIVATE,它可以讓事情始終如一,而不會破壞現有的代碼。 Bri

相關問題