封裝繼承多態到底講的是什麼

来源:http://www.cnblogs.com/john69-/archive/2016/01/04/5098060.html
-Advertisement-
Play Games

封裝、繼承、多態並不是針對C#語言提出來的,他是一個在面向對象思想下產生的一個概念。所以想要弄明白封裝、繼承、多態,首先就要先瞭解面向對象概念。封裝:當我們提及面向對象的時候,這個對象怎麼來?就是通過我們人為的封裝得來。封裝就是把一些特征或功能組合到一個抽象的對象上。就比如說電腦:它的特征是有一個顯...


封裝、繼承、多態並不是針對C#語言提出來的,他是一個在面向對象思想下產生的一個概念。所以想要弄明白封裝、繼承、多態,首先就要先瞭解面向對象概念。

封裝:當我們提及面向對象的時候,這個對象怎麼來?就是通過我們人為的封裝得來。封裝就是把一些特征或功能組合到一個抽象的對象上。就比如說電腦:它的特征是有一個顯示屏,有一個主機,有滑鼠和鍵盤等等。功能有計算等。那我們把這些特征和功能組合到“電腦”這個抽象的名詞上時,“電腦”於是就有了這些特征和功能。但這個“電腦”不是實物,它代表所有名叫“電腦”的實物的名稱。在C#中,我們把封裝好的抽象的名詞叫"class",所以我們稱“電腦”叫一個類(class),而實體電腦叫這個類的對象(或者叫實例)。 而繼承、多態則是類的特性。
繼承:這個詞就用正常的語義來解釋就可以了,比如說你繼承了你父親的優點。而在C#中類也是可以繼承的(單繼承),比如說我們有了“電腦”這個類,現在我們再定義一個類叫“聯想電腦”,難道我們要把電腦的特征、功能再定義一遍?可以是可以的,但是這樣一方面代碼有點重覆,另一方向也不方便管理和說明“聯想電腦”的特征。所以我們可以讓“聯想電腦”繼承於“電腦”這個類,我們稱“聯想電腦”為“電腦”的子類或派生類,而“電腦”叫做父類或基類。這樣,只要“電腦”有的東西,“聯想電腦”都有,但是“聯想電腦”還可以進化出(再添加)自己特有的東西。所以,父類(基類)為子類(派生類)的子集。

多態性(polymorphism):是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。

實現多態,有二種方式,覆蓋,重載。


  • 覆蓋(override),是指子類重新定義父類的虛函數的做法。
  • 重載(overload),是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。

  其實,重載的概念並不屬於“面向對象編程”,重載的實現是:編譯器根據函數不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就成了不同的函數(至少對於編譯器來說是這樣的)。


比如有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函數名稱可能是這樣的:int_func、str_func。對於這兩個函數的調用,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關!真正和多態相關的是“覆蓋”。當子類重新定義了父類的虛函數後,父類指針根據賦給它的不同的子類指針,動態(記住:是動態!)的調用屬於子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定(晚綁定)。結論就是:重載只是一種語言特性,與多態無關,與面向對象也無關!引用一句Bruce Eckel的話:“不要犯傻,如果它不是晚綁定,它就不是多態。”


  那麼,多態的作用是什麼呢?我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態則是為了實現另一個目的——介面重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。

註:(本文來自多出轉載1.:http://www.nowamagic.net/librarys/veda/detail/1835)
  (
本文來自多出轉載2.:http://zhidao.baidu.com/link?url=2IRUVRzvQ_IFgJ3Vkc7JErLABk_8D35qZFpLuJT5JEOCLHh-vfgU-MTXE3bUmu7Y2BTYHqFMikMaPQo0HFjg9LZt9Wmkr5ECH1Gh4vY14Ci)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以前覺得吧,寫文章純屬浪費時間,有那麼點時間還不如玩會游戲、和姑娘聊聊天。現在這覺得,寫寫讀書筆記也是好的,一來信息分享,(各個雲平臺不就是分享、然後大數據麽)二來溫故而知新,加深了對知識的理解。話不多說,繼續寫 問題:在C++中一個空類,他會產生多少個函數呢? 答案還是慢慢揭曉,首先介紹C++幾....
  • 二維碼,是一種採用黑白相間的平面幾何圖形通過相應的編碼演算法來記錄文字、圖片、網址等信息的條碼圖片。如下圖二維碼的特點:1. 高密度編碼,信息容量大可容納多達1850個大寫字母或2710個數字或1108個位元組,或500多個漢字,比普通條碼信息容量約高幾十倍。2. 編碼範圍廣該條碼可以把圖片、聲音、文字...
  • 題目:Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.Below is one possible representa...
  • 題目:Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.You should preserve th...
  • 一級指針與二級指針的概念和用法
  • 文章目的對於跨平臺編譯,網上有很多教程和解釋,但零零碎碎總感覺不完整,所以想集中整理一下。但跨平臺編譯是一個很寬泛的問題,如果要全部說清楚,涉及到的問題會有很多,多番查證文獻也會拖慢進度,所以決定隱藏不必要的技術細節,從“不求甚解”的角度,解釋一下跨平臺遇到的各種問題。預計隱藏的部分1.舉例子。比如...
  • 1 static void Ckeditor()2 {3 string tags = @"1234";4 //正則表達式的引擎是貪婪,只要模式允許,它將匹配儘可能多的字元。5 //如何匹配滿足條件的最短字元? 通...
  • 經過前面一段時間的努力,終於把我所知道的關於solr的內容都總結完了。前面講到了solr的安裝配置,web管理後臺的使用,solr的查詢參數和查詢語法,還說到了solr的客戶端solrnet的基本用法和Query,Facet,高亮等實際開發中的常用方法。可以說solr的相關的基礎的內容,都已經講.....
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...