2013-02-26 74 views
0

我有,其中在保護部分的抽象方法聲明一個抽象類。 我可以在其子中重新定義這種方法爲私人嗎?重新定義保護的抽象方法,私人

它看起來邏輯上 - 在抽象類中,這種方法應受保護,以供兒童 (並且僅限兒童)使用; 但在子項中,此方法可以是私有的,它(方法)不會在此類的對象之外調用。

我可以這樣呢?

+0

稍微不同的解決方案,它是那麼優雅,但不依賴於編譯器的神祕知識可能是一分爲二的方法 - 得到保護的一個可怕的名字,提醒可能的呼叫者,並通過小包裝提供對它的訪問方法與「正常」名稱。 – 2013-02-26 15:32:04

+0

增加:不要將受保護的方法命名爲醜陋,而是將其標記爲「不贊成」。用'{$ WARN SYMBOL_DEPRECATED OFF}'/'{$ WARN SYMBOL_DEPRECATED ON}'圍繞允許的一個呼叫站點(即在私有包裝中)。 – 2013-02-26 15:38:07

回答

1

你確實可以做到這一點。

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是私人的。

所以,我的建議是,雖然你提出什麼是可能的,你不這樣做。作爲一個經驗法則,你應該避免降低成員的知名度。

+0

「位於不同的單位」是這裏的關鍵語句這可能不是完全顯然對初學者 – 2013-02-26 14:32:13

+1

爲什麼不把它'嚴格private',而不是評論? – 2013-02-26 14:36:44

+0

'TMyAbstractBase(obj).Foo'或'(obj as TMyAbstractBase).Foo'?看起來像編譯器錯誤。如果你想使一個方法最終被密封 - 那麼就標記它。 – 2013-02-26 14:37:36