類成員的保護方式

    定義類,就是將該類的字段、屬性、事件、方法(類中的函數和過程)封裝在類的內部。這些字段、屬性、事件、方法就是類的成員。就對象而言,也是對象的數據和成員。類成員的保護模式也就是類成員訪問時的可見性,對於這些數據和成員的訪問,有以下四種保護(訪問)模式,分別使用下列關鍵字:
    1、Private(私有的)
    在Private部分聲明的成員是私有的,它們只能被同一類中的方法訪問。其它類是保密、封閉的,不能隨總意訪問它。但是,private成員保護並不嚴格,如果相關類的聲明放在同一模塊中(即同一個單元文件中),這些類就可以訪問同模塊的其它類的private成員。通過對私有成員的限制,可以更好地封裝和保護自己的類。

    2、Public(公有的)
    在Public部分聲明的成員是公有的,它們可以被其它類的對象實例訪問引用。其成員完全可以被訪問,可見性最大。雖然該成員使用方便、不受限制,但在編程中不能濫用。通常在設計中,應該保持該成員簡明,並儘早定義使之穩定。因爲public成員作爲公共接口顯然會在很多地方用到,設計不慎既會對使用該接口的其他類帶來影響,又會威脅到自身類的封裝性。

    3、Protected(保護的)
    在Protected部分聲明的成員是保護性私有的,它們不僅能被同一類中的方法訪問,還可由其子(派生)類中也可訪問和引用。

    4、Published(公佈的)
    在Published部分聲明的成員是公有的,它們不僅能被同一類中和其子(派生)類中訪問和引用,其它類中也可訪問和引用。
    公佈屬性的數據類型是受限制的。有序型、字符型、類、接口和方法指針可以被公佈。當集合類型的基礎類型是有序類型,且上界和下界介於0到31時,集合類型也可以公佈的。集合只要符合byte、word、double word,(除了Real48外)任何實數類型都是可以公佈的;而數組類型的屬性(區別於數組屬性)不能公佈的。
    一些屬性雖然可以公佈,但不能完全支持流系統,它們包括:記錄類型的屬性、所有可公佈的數組屬性,以及包含匿名值的枚舉類型的屬性。如果published屬性屬於上述的類型,在Object Inspector中則不能正確顯示這些屬性,並且使用流向磁盤操作時也不能保存它們的值。
    所有的方法都是可以公佈的,但一個類不能使用相同的名字公佈兩個或兩個以上的的被重載的方法。只有當數據成員屬於類或接口類型時,它纔是可以公佈的。
    上述種種限制,是因爲published聲明編譯器存儲VMT中的信息,也就是說只有特定類型的可以存儲。當用戶不需要使用VMT信息時,使用public聲明效果相同。
      
     5、automated:這個關鍵字Delphi2以上版本已不使用,保留它,就是要與Delphi2代碼相兼容。
    由automated聲明的類的成員,類似於public部分聲明的成員。它們都是公共的,唯一區別是,由automated聲明的方法和屬性將生成OLE自動化操作的類型信息。


    注意:Public成員和Published成員具有相同的可見性,不同之處是published成員會產生RTTI(Runtime Type Infomation,運行期類型庫)。RTTI使應用程序能動態地查詢一個對象的數據成員和屬性,也能定位它的方法。RTTI用於在存儲文件和文件導入時訪問屬性的值,也可用於在Object Inspector中顯示屬性,並且能爲一些屬性(即事件)關聯特定的方法(即事件的處理程序)。

    在Delphi中,在類聲明中使用保護模式,其語法格式:
    type 類名=class(基類)
      Private
        {字段聲明}
        {方法聲明}
        {屬性聲明}
      Public
        {字段聲明}
        {方法聲明}
        {屬性聲明}
      Protected
        {字段聲明}
        {方法聲明}
        {屬性聲明}
      Published
        {字段聲明}
        {方法聲明}
        {屬性聲明}
    end;
 
    注意:上述聲明中,缺省保護模式關鍵,默認使用關鍵字Public。(當在{$M+}狀態下編譯類時,保護方式是published)。類可以有任何數目的字段,字段後跟方法和屬性的聲明。方法和屬性的聲明可以混合在一起。但是在一種保護模式中,字段的聲明必須在所有方法和屬性的聲明之前。
    在類的繼承關係中,派生類可以通過重新聲明來變更類成員的保護模式,但這種變更只能增加成員的可見性,不能降低它的可見性。比如,一個protected屬性在派生類中能被變更爲public,但不能改爲private。另外,published成員在派生類中不能改爲public。
   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章