我有,其中在保護部分的抽象方法聲明一個抽象類。 我可以在其子中重新定義這種方法爲私人嗎?重新定義保護的抽象方法,私人
它看起來邏輯上 - 在抽象類中,這種方法應受保護,以供兒童 (並且僅限兒童)使用; 但在子項中,此方法可以是私有的,它(方法)不會在此類的對象之外調用。
我可以這樣呢?
我有,其中在保護部分的抽象方法聲明一個抽象類。 我可以在其子中重新定義這種方法爲私人嗎?重新定義保護的抽象方法,私人
它看起來邏輯上 - 在抽象類中,這種方法應受保護,以供兒童 (並且僅限兒童)使用; 但在子項中,此方法可以是私有的,它(方法)不會在此類的對象之外調用。
我可以這樣呢?
你確實可以做到這一點。
type
TMyAbstractBase = class
protected
procedure Foo; virtual; abstract;
public
procedure DoFoo;
end;
TMyDerived = class(TMyAbstractBase)
private
procedure Foo; override;
end;
procedure TMyAbstractBase.DoFoo;
begin
Foo;
end;
procedure TMyDerived.Foo;
begin
Writeln('TMyDerived.Foo');
end;
然後將下面的代碼,位於當然不同的單位,不編譯:
var
obj: TMyDerived;
....
obj.Foo;//[dcc32 Error]: E2361 Cannot access private symbol TMyDerived.Foo
這不是一個好主意,但做到這一點。現在考慮這個班級,再次聲明在不同的單位。
type
TMyDerived2 = class(TMyDerived)
public
procedure Foo; override;
end;
procedure TMyDerived2.Foo;
begin
inherited;//this does nothing
Writeln('TMyDerived2.Foo');
end;
如果TMyDerived2.Foo
執行過,那麼inherited
聲明不做任何事情。那是因爲TMyDerived.Foo
是私人的。
所以,我的建議是,雖然你提出什麼是可能的,你不這樣做。作爲一個經驗法則,你應該避免降低成員的知名度。
「位於不同的單位」是這裏的關鍵語句這可能不是完全顯然對初學者 – 2013-02-26 14:32:13
爲什麼不把它'嚴格private',而不是評論? – 2013-02-26 14:36:44
'TMyAbstractBase(obj).Foo'或'(obj as TMyAbstractBase).Foo'?看起來像編譯器錯誤。如果你想使一個方法最終被密封 - 那麼就標記它。 – 2013-02-26 14:37:36
稍微不同的解決方案,它是那麼優雅,但不依賴於編譯器的神祕知識可能是一分爲二的方法 - 得到保護的一個可怕的名字,提醒可能的呼叫者,並通過小包裝提供對它的訪問方法與「正常」名稱。 – 2013-02-26 15:32:04
增加:不要將受保護的方法命名爲醜陋,而是將其標記爲「不贊成」。用'{$ WARN SYMBOL_DEPRECATED OFF}'/'{$ WARN SYMBOL_DEPRECATED ON}'圍繞允許的一個呼叫站點(即在私有包裝中)。 – 2013-02-26 15:38:07