封裝(物件導向程式設計) - 維基百科,自由的百科全書

文章推薦指數: 80 %
投票人數:10人

在物件導向程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式介面的實作細節部份包裝、隱藏起來的方法。

同時,它也是一種防止外界呼叫端,去存取 ... 封裝(物件導向程式設計) 維基百科,自由的百科全書 跳至導覽 跳至搜尋 在物件導向程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式介面的實作細節部份包裝、隱藏起來的方法。

同時,它也是一種防止外界呼叫端,去存取物件內部實作細節的手段,這個手段是由程式語言本身來提供的。

封裝被視為是物件導向的四項原則之一。

適當的封裝,可以將物件使用介面的程式實作部份隱藏起來,不讓使用者看到,同時確保使用者無法任意更改物件內部的重要資料,若想接觸資料只能通過公開接入方法(Publiclyaccessiblemethods)的方式(如:"getters"和"setters")。

它可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。

[來源請求] 目次 1解釋 1.1封裝和繼承 2信息隱藏 3程式範例 3.1保留字 3.1.1C#範例 3.1.2JAVA範例 3.2名字修飾(Namemangling) 4參考文獻 解釋[編輯] 在物件導向的語言裡,封裝往往指以下兩個相關聯但是獨立的概念,有時候這兩者是存在因果關係。

[1][2] 一種程式語言的機制,限制直接存取某些物件的部件。

[3][4] 一種程式語言的結構體,其將資料和操作該資料的方法綁在一起,提供了便利性。

[5][6] 一些程式語言的研究者和學者將定義①或者定義①+②作為辨認一門語言是否為物件導向語言的標準之一。

一些程式語言提供了閉包作為封裝,但是這種功能不屬於物件導向的範疇。

在許多程式語言里,組件並不會自動隱藏並且能夠被重寫,因此,一些傾向於定義②的人會將資訊隱藏(informationhiding)作為一個單獨的定義③列舉出來。

在使用類的大多物件導向的程式語言中,雖然封裝是被支援的,但是仍有其他替代品可以選擇。

封裝和繼承[編輯] 《DesignPatterns》的作者們曾經大篇幅地討論封裝和繼承的矛盾。

根據他們自身的經驗,設計師們濫用繼承。

他們認為繼承將破壞封裝,考慮父類別的實現細節將暴露給子類。

[7] 父類別的內部實現對於子類來說是不透明的(實現一個子類時,你需要了解父類別的實現細節,以此決定是否需要重寫某個方法)。

[8]同時,一旦父類別被修改,因為子類依賴著父類別,所以子類的實現也需要被重新審視。

資訊隱藏[編輯] 封裝可以隱藏成員變數以及成員函式,物件的內部實現通常被隱藏,並用定義代替。

舉個例子,僅僅物件自身的方法能夠直接接觸或者操作這些成員變數。

隱藏物件內部資訊能供保證一致性:當使用者擅自修改內部部件的資料,這可能造成內部狀態不一致或者不可用;隱藏物件內部資訊能阻止這種後果。

一個眾所周知的好處是,降低系統的複雜度和提高健壯性。

大多數語言(如:C++、C#、Delphi、Java)通過設定等級去控制內部資訊隱藏,經典的是通過保留字public暴露資訊和private隱藏資訊。

一些語言(如:Smalltalk和Ruby)只允許物件去存取隱藏資訊。

通常,也是存在方法去暴露隱藏資訊,如通過反射(Ruby、Java、C#、etc.)或名字修飾(Python)。

程式範例[編輯] 保留字[編輯] C#範例[編輯] 這是一段C#代碼,演示了如何使用private關鍵字限制變數的存取: namespaceEncapsulation { classProgram { publicclassAccount { privatedecimalaccountBalance=500.00m; publicdecimalCheckBalance() { returnaccountBalance; } } staticvoidMain() { AccountmyAccount=newAccount(); decimalmyBalance=myAccount.CheckBalance(); /*Main方法能够通过public的“CheckBalance”方法确认账户余额,但是不能更改它*/ } } } JAVA範例[編輯] 下面是Java的演示程式: publicclassEmployee{ privateBigDecimalsalary=newBigDecimal(50000.00); publicBigDecimalgetSalary(){ returnsalary; } publicstaticvoidmain(){ Employeee=newEmployee(); BigDecimalsal=e.getSalary(); } } 名字修飾(Namemangling)[編輯] 下面是Python的要給實例,Python並不支援隱藏變數。

然而約定俗成,_var形式的變數被認為是私有變數。

classCar: def__init__(self): self._maxspeed=200 defdrive(self): print(f'maximumspeedis{self._maxspeed}') redcar=Car() redcar.drive()#打印'maximumspeedis200' redcar._maxspeed=10 redcar.drive()#打印'maximumspeedis10' 參考文獻[編輯] ^Scott,MichaelLee.Programminglanguagepragmatics2.MorganKaufmann.2006:481.ISBN 978-0-12-633951-2.Encapsulationmechanismsenabletheprogrammertogroupdataandthesubroutinesthatoperateonthemtogetherinoneplace,andtohideirrelevantdetailsfromtheusersofanabstraction.  ^Dale,NellB.;Weems,Chip.ProgrammingandproblemsolvingwithJava2nd.Jones&Bartlett.2007:396.ISBN 978-0-7637-3402-2.  ^Mitchell,JohnC.Conceptsinprogramminglanguages.CambridgeUniversityPress.2003:522.ISBN 978-0-521-78098-8.  ^Pierce,Benjamin.TypesandProgrammingLanguages.MITPress.2002:266.ISBN 978-0-262-16209-8.  ^Rogers,Wm.Paul.Encapsulationisnotinformationhiding.JavaWorld.18May2001[2019-11-22].(原始內容存檔於2013-10-29).  ^Connolly,ThomasM.;Begg,CarolynE.Ch.25:IntroductiontoObjectDMBS§Object-orientedconcepts.Databasesystems:apracticalapproachtodesign,implementation,andmanagement4th.PearsonEducation.2005:814.ISBN 978-0-321-21025-8.  ^Gamma,Erich;Helm,Richard;Johnson,Ralph;Vlissides,John.DesignPatterns.Addison-Wesley.1994.ISBN 978-0-201-63361-0.  ^蕭蕭.怎样理解“组合优于继承”以及“OO的反模块化”,在这些方面FP具体来说有什么优势?.2017-06-09[2019-11-22].(原始內容存檔於2020-02-04)(中文(簡體)).  取自「https://zh.wikipedia.org/w/index.php?title=封裝_(物件導向程式設計)&oldid=72864082」 分類:​物件導向的程序設計隱藏分類:​含有英語的條目自2022年6月有未列明來源語句的條目 導覽選單 個人工具 沒有登入討論貢獻建立帳號登入 命名空間 條目討論 臺灣正體 不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體 查看 閱讀編輯檢視歷史 更多 搜尋 導航 首頁分類索引特色內容新聞動態近期變更隨機條目資助維基百科 說明 說明維基社群方針與指引互助客棧知識問答字詞轉換IRC即時聊天聯絡我們關於維基百科 工具 連結至此的頁面相關變更上傳檔案特殊頁面靜態連結頁面資訊引用此頁面維基數據項目 列印/匯出 下載為PDF可列印版 其他語言 العربيةAzərbaycancaБългарскиBosanskiCatalàČeštinaDeutschΕλληνικάEnglishEspañolفارسیSuomiFrançaisעבריתMagyarՀայերենItaliano日本語ქართულიҚазақша한국어LietuviųPolskiPortuguêsРусскийSrpskohrvatski/српскохрватскиShqipСрпски/srpskiSvenskaதமிழ்TürkçeУкраїнськаTiếngViệt粵語 編輯連結



請為這篇文章評分?