發現很多面試官都喜歡問這個問題(我是學生),然而每次覺得自己在這個問題上都答得不盡人意。
我的回答往往是
它的設計上的特點是:繼承、封裝、多態;
從具像到抽象。屬性變成變量,行為變成方法;
然而面試官似乎不是很滿意,不知各路大神有沒有相對優雅的回答?
發現很多面試官都喜歡問這個問題(我是學生),然而每次覺得自己在這個問題上都答得不盡人意。
我的回答往往是
它的設計上的特點是:繼承、封裝、多態;
從具像到抽象。屬性變成變量,行為變成方法;
然而面試官似乎不是很滿意,不知各路大神有沒有相對優雅的回答?
先回答是一種程式設計範式。
接著把你說的三個特性的具體描述說一下,例如:
繼承:可以使子類別復用父類別公開的變數、方法;
封裝:屏蔽一系列的細節。使外部呼叫時只要知道這個方法的存在;
多態:父類別的方法繼承的到子類別以後可以有不同的實作方式;
接著你可以說一說物件導向的優點和缺點,那麼一件事情是沒有絕對的優點和缺點的,需要一個對比。故此,你得說一說面向過程的程式設計思想。
回來丟文章了
看了lz的問題被踩了,我在社區裡看了一下,的確有相關的答案。我的文章算是小補充,如果有問題望各位指出。
面向對象的思想
再用我工作中的實例回答補充下,前段時間要做一個很簡單的功能,點讚
,確實是一個很簡單的功能,但點讚的功能不只是一次,用戶可以給其他的評論點贊,可以給文章點贊,可以給問題點讚等等,而且點讚之後可能觸發一系列的事件(通知相關用戶等),最初我想的有三種寫法
<code>// 1.文章被用户点赞 $article->votedBy($user); // 2.用户给某篇文章点赞 $user->voteArticle($article); // 3.用户伸出大拇指给某篇文章点赞 $user->thumbUp()->voteToArticle($article); //$user->thumbUp()->voteToDiscuss($discuss);</code>
最後我用了第三個寫法,具體怎麼實現,在你伸出大拇指的那一刻你就知道了。
這真的是個有趣的問題,哈哈。當然每個人都會有不同的理解,畢竟物件導向這個概念也是炒作起來的。
我的理解包含兩個面向:
一個是物件導向設計;
一個是物件導向程式設計。
物件導向設計的核心思想是模組化,而物件導向程式設計的核心思想是面向接口,物件導向程式設計還有一個親戚叫基於物件程式或叫原型程式設計(JavaScript就是)。所以說物件導向程式設計一般是需要語言層級支援的,就像你上面說的封裝、繼承和多型什麼的。
物件導向概念比較火熱的時候,人們常說軟體復用,繼承是軟體復用的直接體現。但是後來人們發現,應該更多的使用組合而不是繼承,接著面向介面程式設計就火了。
扯得有點遠了,到此打住吧。
萬物皆對象。
object-oriented
everything is object
一定用例子來
例如 動物-》furu動物-》 人, 獅子, 老虎
加上多態,例如都會叫
繼承,例如furu動物都是胎生的,等等
實作專案時,需要將業務抽象化為程式碼,這個抽象過程就是程式設計範式,而物件導向就是其中一種。類似的還有面向過程,函數式程式設計。
面向對象的特徵是繼承
, 多態
, 封裝
。
接著面試官就可以開始問繼承
, 多態
, 封裝
了。
完美! ~~~
最好知道下什麼是面向過程,函數式編程,那就更好了。
self-contained, 如果他不懂, 你就可以直接走人了, 這個面試官太菜!
js說:萬物皆對象,對像也是對象--沒毛病
嗯 一切皆對象
記得在zhihu看過一個回答 他的理解是 (從實踐上來講)最重要的就是代碼的複用。
封裝:可以直接用封裝好的程式碼區塊,這是複用。
繼承:使用已有的屬性,這是重複使用。
多態:不同的細節,但是基礎上依然首先需要重複使用。
不討論高深的程式設計、範式等理論性強的東西,對於寫程式碼本身最直接的優勢和體驗就是,復用的多了,程式碼變得簡潔。
面向你的對象(俗稱男/女朋友),擺出一個優雅的姿勢,然後深情地告訴他/她,看著我……這就是優雅地面向對象
打包資料和相關聯的行為
有趣的問題。我也是學生,談一些自己的理解。
物件導向有個很大的特點是,它同時把資料和行為(對資料的操作)結合起來,和現實世界的運作邏輯更相似。
為什麼這麼覺得,是和傳統的(面向過程等等)比較而得出來的。
打個比方, C 語言對數據和行為的處理其實有點割裂,更重視了行為。它裡面沒有叫「物件」的概念,而是個充滿動作(函數)的世界。主要都是函數呼叫函數,從頭執行到尾巴給出結果……這個世界裡最主要的東西就是各種動作。
而 C++ 的「物件」就特別像一個東西,比如說一個人。它的世界是充滿物體的世界。主要都是物體和物體(人和物體、人和人等等)之間發生關係,這些關係或說碰撞導致了最後的結果……這個世界裡最主要的東西就是各種物體。
物體本身是攜帶資料、攜帶功能的;物體之間發生關係,才有了世界的運作。這兩點,物件導向的程式設計和現實世界更為相像。
而上述「繼承、封裝、多型」等特點,便也可由此來模擬現實世界更了解。我隨便舉點例子…
繼承:書 & 教材 & 電腦類教材 —— 這就是現實世界的繼承關係。
封裝:手機 —— 它是封裝好的,當你使用它時,不必知道裡面的電路邏輯。
多態:人.看(美女) & 人.看(強光) —— 參數類型不一樣,執行的也不一樣。
那面向對象的好處也很容易理解。一個是提高可理解性,因為物件以人類認識世界的規律呈現,符合常用思維方式;第二個就是更容易開發和維護,系統的最佳化很大程度上等於對物件資料和功能的重新認識,在原有基礎上修改一些東西。
哪裡說的不對懇請各位批評指正……!
不排除有些面試官本身就很水,這他媽是一個大的無比的話題,坐一起談幾天都談不完
少逛知乎,多寫程式碼
萬物皆對象。