Golang物件導向之類型、方法、多態

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。Golang物件導向之類型、方法、多態

一、方法與函數

     什麼是方法?與函數的區別?
          方法就是能夠處理某種類型的變數或結構(以下結構也統稱為變數)的函數,稱為該類型的方法
          這意味著,這個變數會傳給這個函數,並且這個函數認識這個變數的內部構造

     怎樣使得一個函數成為一個類型的方法?
          java和cpp將指向該類型變數的“this”指標作為隱含參數傳入該函數
          go將該類型變數的拷貝、或者指向該類型變數的指標作為“接收者”傳入該函數
          java和cpp將該函數藏在類中,以防止外界輕易訪問
          go中方法可以放置在任意位置

     為什麼需要一個函數成為一個類型的方法?
          原因之一:多態性
               如果只有獨立分散的函數來處理各種類型,那麼會有int_print(int a)、string_print(string a)、person_print(Person a)等等
               如果把處理函數隱藏在類型中,則可以全部叫print()而不會名字衝突,這使得多態性成為可能:任意類型變數.print()
          原因之二:安全性
               函數藏身在類型中,可以對外只開放有限的訪問權

二、完整地描述客觀世界的實體

     不僅僅實體本身的構造,還包括給實體配備的方法
          實體本身的構成
               汽車由發動機、油箱、車輪、車廂、方向盤構成
          實體擁有的方法
               拉貨、加油、修車
          廣義地講,不僅僅結構,原始類型,比如int,也是如此,包含一個值,以及加減乘除等方法,而string包含裁剪和串連等方法

     不同語言對實體的描述
          java、cpp通過類
               類裡面有各種變數資料
               類裡面有各種方法,這些方法通過this指標修改和處理類對象
          go
               通過原始類型或struct來描述單一或複雜實體的內部變數
               類型變數通過“接收者”傳遞給函數,使得函數成為該類型的方法
               也即一樣有內部變數資料和可以操作這些變數的方法

三、Go的實體類型及其方法分類

     注意,本質上Go僅僅有值拷貝傳遞。引用傳遞或指標傳遞在實際上都是指標的值拷貝傳遞
     相當於值拷貝傳遞和指標傳遞被顯式地區分開了
     這樣的好處是什嗎?可能是值傳遞預設的安全,因為原變數不可能被修改
     壞處是什嗎?要想通過方法修改一個變數或欄位,必須增加一個指標欄位來指向它?
     或者只是增加傳遞指標的方法,使用“&欄位名”來調用?

     實體類型T
          var i T
          值拷貝傳遞後,方法拿到的是i的值拷貝,因此可能的方法包括所有接收者為T型的函數。原始的T型變數不可能被修改

     指向實體類型的指標
          var i *T
          值拷貝傳遞後,方法拿到的是指向T型變數的指標i,因此可能的方法包括所有接收者為*T的函數,修改“*i”時會修改原始的T型變數
          由於拿到i後,還可以通過“v = *i”來產生一個等值拷貝的T型變數
          因此本類指標的方法還能包括所有接收者為T型的函數,自然原始變數也不會被修改

          Go規範的英文原文是:
               Such a function indirects through the receiver to create a value to pass as the receiver to the underlying method;
               the method does not overwrite the value whose address is passed in the function call.
          感覺是這個意思:
          func(tv *T, a int) int {
               var v
               v = *tv // 在函數的開頭產生了一個局部變數v
               return func_real(v, a) // 餘下的代碼使用局部變數v,而不是“*tv”所指向的值
          }


     interface介面類型
          var i I
          此刻的i完全不同於實體變數或其指標
          i本質上是一指標,可以指向任何包含了介面I的變數
          i的方法就是介面I包含的方法

四、interface介面

     什麼是interface?

          interface是一個介面,規定了一組方法的外觀,或說調用格式,但不實現這些方法
          類似檔案系統的介面,無論底層是什麼檔案格式,總有open()、close()、read()、write()
          凡是有open()、close()、read()、write()這組interface的任何IO裝置均可看成檔案系統
          由此形成了多態性

     通過interface來對實體按外部方法配備進行分類

          type 軟體工程師 interface {
               java編程()
               go編程()
               加班()
               寫文檔()
          }

          type 產品設計師 interface {
               UI設計()
               繪畫()
          }

     interface變數

          可能是一個指標,可以指向任何實現了該interface的實體,而不管實體本身是怎樣的

          var i 軟體工程師       // 以後 i 可以指向任何軟體工程師,可能是任何實體,不局限於人
          i = 小明                    // 或小王、火星人、機器人、一條聰明的狗,只要會java和go編程,會寫文檔會加班
          var j 產品設計師       // 以後 j 可以指向任何產品設計師,可能是任何實體,不局限於人
          j = 小張                    // 也可能是小明,或其他任何人,或動物或狗,只要懂UI設計,懂繪畫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.