如果兩個類都放在一個單元中 - 沒有問題,子類繼承父類的私有方法,但如果它們位於不同單元中,則該類只能訪問公共方法。爲什麼?爲什麼我的子類不會繼承父類的所有方法?
子類不能只訪問私有方法,因爲它們在不同的單元中。
我該如何避免這種情況?在我的情況下,我有3個孩子班,如果我把他們全部放在父班的單位,結果將是非常大的。
如何製作一個繼承了父類中不同單元的私有方法的子類?
謝謝!
如果兩個類都放在一個單元中 - 沒有問題,子類繼承父類的私有方法,但如果它們位於不同單元中,則該類只能訪問公共方法。爲什麼?爲什麼我的子類不會繼承父類的所有方法?
子類不能只訪問私有方法,因爲它們在不同的單元中。
我該如何避免這種情況?在我的情況下,我有3個孩子班,如果我把他們全部放在父班的單位,結果將是非常大的。
如何製作一個繼承了父類中不同單元的私有方法的子類?
謝謝!
的私有方法是(單位)私人。你需要的是一種受保護的方法。受保護的方法可以由任何繼承自基類的類訪問,即使它們位於不同的單元中。用戶代碼不能訪問它們(除非他從類繼承)。
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;
你的類不能訪問這些方法,因爲它們是私有的祖先類。您需要閱讀關於公共,私人和受保護可見性的幫助文件。重做你的課程,以便這些方法受到保護,如果你需要在後代中使用它們。
這是類方法範圍的遺留問題。嚴格來說,私有方法永遠不可能從其他類中看到,但Borland以他們的智慧在同一個單元內實現了這一點,可能是爲了與FORWARD聲明兼容。隨後,創建了大量利用此功能的代碼。爲了執行此操作,Delphi現在已經引入了STRICT PRIVATE,它可以讓事情始終如一,而不會破壞現有的代碼。 Bri
從Delphi 2006開始,還有一個嚴格的修改器(比如嚴格的私有)。使用這個修飾符,私有/受保護的工作就像C++一樣(嚴格私有 - 外部沒有人可以訪問方法,嚴格保護 - 只有類和子類可以訪問方法)。 – 2009-07-16 11:00:56