<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                golang 面向對象特性 和其他高級語言一樣,golang 也支持面向對象編程,支持得比較簡單,有些特性并不支持,但是夠用了 **接口** 接口使用 interface 關鍵字聲明,任何實現接口定義方法的類都可以實例化該接口,接口和實現類之間沒有任何依賴,你可以實現一個新的類當做 Sayer 來使用,而不需要依賴 Sayer 接口,也可以為已有的類創建一個新的接口,而不需要修改任何已有的代碼,和其他靜態語言相比,這可以算是 golang 的特色了吧 ~~~ type Sayer interface { Say(message string) SayHi() } ~~~ **繼承** 繼承使用組合的方式實現 ~~~ type Animal struct { Name string } func (a *Animal) Say(message string) { fmt.Printf("Animal[%v] say: %v\n", a.Name, message) } type Dog struct { Animal } ~~~ Dog 將繼承 Animal 的 Say 方法,以及其成員 Name **覆蓋** 子類可以重新實現父類的方法 ~~~ // override Animal.Say func (d *Dog) Say(message string) { fmt.Printf("Dog[%v] say: %v\n", d.Name, message) } ~~~ Dog.Say 將覆蓋 Animal.Say **多態** 接口可以用任何實現該接口的指針來實例化 ~~~ var sayer Sayer sayer = &Dog{Animal{Name: "Yoda"}} sayer.Say("hello world") ~~~ 但是不支持父類指針指向子類,下面這種寫法是不允許的 ~~~ var animal *Animal animal = &Dog{Animal{Name: "Yoda"}} ~~~ 同樣子類繼承的父類的方法引用的父類的其他方法也沒有多態特性 ~~~ func (a *Animal) Say(message string) { fmt.Printf("Animal[%v] say: %v\n", a.Name, message) } func (a *Animal) SayHi() { a.Say("Hi") } func (d *Dog) Say(message string) { fmt.Printf("Dog[%v] say: %v\n", d.Name, message) } func main() { var sayer Sayer sayer = &Dog{Animal{Name: "Yoda"}} sayer.Say("hello world") // Dog[Yoda] say: hello world sayer.SayHi() // Animal[Yoda] say: Hi } ~~~ 上面這段代碼中,子類 Dog 沒有實現 SayHi 方法,調用的是從父類 Animal.SayHi,而 Animal.SayHi 調用的是 Animal.Say 而不是Dog.Say,這一點和其他面向對象語言有所區別,需要特別注意,但是可以用下面的方式來實現類似的功能,以提高代碼的復用性 ~~~ func SayHi(s Sayer) { s.Say("Hi") } type Cat struct { Animal } func (c *Cat) Say(message string) { fmt.Printf("Cat[%v] say: %v\n", c.Name, message) } func (c *Cat) SayHi() { SayHi(c) } func main() { var sayer Sayer sayer = &Cat{Animal{Name: "Jerry"}} sayer.Say("hello world") // Cat[Jerry] say: hello world sayer.SayHi() // Cat[Jerry] say: Hi } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看