亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 淺談Go語言多態的實現與interface使用

淺談Go語言多態的實現與interface使用

熱門標簽:外呼系統顯本地手機號 壽光微信地圖標注 百度地圖標注后傳給手機 外呼系統用什么卡 電話機器人軟件免費 涿州代理外呼系統 評價高的400電話辦理 excel地圖標注分布數據 阿克蘇地圖標注

一、多態的含義

對于Java或者是C++而言,我們在使用變量的時候,變量的類型是明確的。但是如果我們希望它可以寬松一點,比如說我們用父類指針或引用去調用方法,但是在執行的時候,能夠根據子類的類型去執行子類當中的方法。也就是說實現我們用相同的調用方式調出不同結果或者是功能的情況,這種情況就叫做多態。

舉個非常經典的例子,比如說貓、狗和人都是哺乳動物。這三個類都有一個say方法,大家都知道貓、狗以及人類的say是不一樣的,貓可能是喵喵叫,狗是汪汪叫,人類則是說話。

class Mammal {
    public void say() {
    System.out.println("do nothing")
    }
}


class Cat extends Mammal{
    public void say() {
    System.out.println("meow");
    }
}


class Dog extends Mammal{
    public void say() {
    System.out.println("woof");
    }
}

class Human extends Mammal{
    public void say() {
    System.out.println("speak");
    }
}

這段代碼大家應該都不難看懂,這三個類都是Mammal的子類,假設這個時候我們有一系列實例,它們都是Mammal的子類的實例,但是這三種類型都有,我們希望用一個循環來一起全都調用了。雖然我們接收變量的時候是用的Mammal的父類類型去接收的,但是我們調用的時候卻會獲得各個子類的運行結果。

比如這樣:

class Main {
    public static void main(String[] args) {
        ListMammal> mammals = new ArrayList>();
        mammals.add(new Human());
        mammals.add(new Dog());
        mammals.add(new Cat());
        
        for (Mammal mammal : mammals) {
            mammal.say();
        }
    }
}

不知道大家有沒有get到精髓,我們創建了一個父類的List,將它各個子類的實例放入了其中。然后通過了一個循環用父類對象來接收,并且調用了say方法。我們希望雖然我們用的是父類的引用來調用的方法,但是它可以自動根據子類的類型調用對應不同子類當中的方法。

也就是說我們得到的結果應該是:

speak

woof

meow

這種功能就是多態,說白了我們可以在父類當中定義方法,在子類當中創建不同的實現。但是在調用的時候依然還是用父類的引用去調用,編譯器會自動替我們做好內部的映射和轉化。

二、抽象類與接口

這樣實現當然是可行的,但其實有一個小小的問題,就是Mammal類當中的say方法多余了。因為我們使用的只會是它的子類,并不會用到Mammal這個父類。所以我們沒必要實現父類Mammal中的say方法,做一個標記,表示有這么一個方法,子類實現的時候需要實現它就可以了。

這就是抽象類和抽象方法的來源,我們可以把Mammal做成一個抽象類,聲明say是一個抽象方法。抽象類是不能直接創建實例的,只能創建子類的實例,并且抽象方法也不用實現,只需要標記好參數和返回就行了。具體的實現都在子類當中進行。說白了抽象方法就是一個標記,告訴編譯器凡是繼承了這個類的子類必須要實現抽象方法,父類當中的方法不能調用。那抽象類就是含有抽象方法的類。

我們寫出Mammal變成抽象類之后的代碼:

abstract class Mammal {
    abstract void say();
}

很簡單,因為我們只需要定義方法的參數就可以了,不需要實現方法的功能,方法的功能在子類當中實現。由于我們標記了say這個方法是一個抽象方法,凡是繼承了Mammal的子類都必須要實現這個方法,否則一定會報錯。

抽象類其實是一個擦邊球,我們可以在抽象類中定義抽象的方法也就是只聲明不實現,也可以在抽象類中實現具體的方法。在抽象類當中非抽象的方法子類的實例是可以直接調用的,和子類調用父類的普通方法一樣。但假如我們不需要父類實現方法,我們提出提取出來的父類中的所有方法都是抽象的呢?針對這一種情況,Java當中還有一個概念叫做接口,也就是interface,本質上來說interface就是抽象類,只不過是只有抽象方法的抽象類。

所以剛才的Mammal也可以寫成:

interface Mammal {
    void say();
}

把Mammal變成了interface之后,子類的實現沒什么太大的差別,只不過將extends關鍵字換成了implements。另外,子類只能繼承一個抽象類,但是可以實現多個接口。早先的Java版本當中,interface只能夠定義方法和常量,在Java8以后的版本當中,我們也可以在接口當中實現一些默認方法和靜態方法。

接口的好處是很明顯的,我們可以用接口的實例來調用所有實現了這個接口的類。也就是說接口和它的實現是一種要寬泛許多的繼承關系,大大增加了靈活性。

以上雖然全是Java的內容,但是講的其實是面向對象的內容,如果沒有學過Java的小伙伴可能看起來稍稍有一點點吃力,但總體來說問題不大,沒必要細扣當中的語法細節,get到核心精髓就可以了。

講這么一大段的目的是為了厘清面向對象當中的一些概念,以及接口的使用方法和理念,后面才是本文的重頭戲,也就是Go語言當中接口的使用以及理念。

三、Golang中的接口

Golang當中也有接口,但是它的理念和使用方法和Java稍稍有所不同,它們的使用場景以及實現的目的是類似的,本質上都是為了抽象。通過接口提取出了一些方法,所有繼承了這個接口的類都必然帶有這些方法,那么我們通過接口獲取這些類的實例就可以使用了,大大增加了靈活性。

但是Java當中的接口有一個很大的問題就是侵入性,說白了就是會顛倒供需關系。舉個簡單的例子,假設你寫了一個爬蟲從各個網頁上爬取內容。爬蟲爬到的內容的類別是很多的,有圖片、有文本還有視頻。假設你想要抽象出一個接口來,在這個接口當中定義你規定的一些提取數據的方法。這樣不論獲取到的數據的格式是什么,你都可以用這個接口來調用。這本身也是接口的使用場景,但問題是處理圖片、文本以及視頻的組件可能是開源或者是第三方的,并不是你開發的。你定義接口并沒有什么卵用,別人的代碼可不會繼承這個接口。

當然這也是可以解決的, 比如你可以在這些第三方工具庫外面自己封裝一層,實現你定義的接口。這樣當然是OK的,但是顯然比較麻煩。

Golang當中的接口解決了這個問題,也就是說它完全拿掉了原本弱化的繼承關系,只要接口中定義的方法能對應的上,那么就可以認為這個類實現了這個接口。

我們先來創建一個interface,當然也是通過type關鍵字:

type Mammal interface {
 Say()
}

我們定義了一個Mammal的接口,當中聲明了一個Say函數。也就是說只要是擁有這個函數的結構體就可以用這個接口來接收,我們和剛才一樣,定義Cat、Dog和Human三個結構體,分別實現各自的Say方法:

type Dog struct{}

type Cat struct{}

type Human struct{}

func (d Dog) Say() {
 fmt.Println("woof")
}

func (c Cat) Say() {
 fmt.Println("meow")
}

func (h Human) Say() {
 fmt.Println("speak")
}

之后,我們嘗試使用這個接口來接收各種結構體的對象,然后調用它們的Say方法:

func main() {
    var m Mammal
    m = Dog{}
    m.Say()
    m = Cat{}
    m.Say()
    m = Human{}
    m.Say()
}

出來的結果當然和我們預想的一樣:

四、總結

今天我們一起聊了面向對象中多態以及接口的概念,借此進一步了解了為什么golang中的接口設計非常出色,因為它解耦了接口和實現類之間的聯系,使得進一步增加了我們編碼的靈活度,解決了供需關系顛倒的問題。但是世上沒有絕對的好壞,golang中的接口在方便了我們編碼的同時也帶來了一些問題,比如說由于沒了接口和實現類的強綁定,其實也一定程度上增加了開發和維護的成本。

總體來說這是一個仁者見仁的改動,有些寫慣了Java的同學可能會覺得沒有必要,這是過度解綁,有些人之前深受其害的同學可能覺得這個進步非常關鍵。但不論你怎么看,這都不影響我們學習它,畢竟學習本身是不帶立場的。今天的內容當中包含一些Java和面向對象的概念,只是用來引出后面golang的內容,如果存在部分不理解的地方,希望大家抓大放小,理解核心關鍵就好了,不需要細扣每一個細節。

以上就是淺談Go語言多態的實現與interface使用的詳細內容,更多關于Go 多態與interface的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • 使用go的interface案例實現多態范式操作
  • Go語言實現類似c++中的多態功能實例
  • golang語言如何將interface轉為int, string,slice,struct等類型
  • golang基礎之Interface接口的使用
  • golang struct 實現 interface的方法
  • golang中struct和interface的基礎使用教程
  • Go之interface的具體使用
  • Go語言中你不知道的Interface詳解
  • golang中interface接口的深度解析

標簽:嘉峪關 宜賓 新余 江西 張掖 黑龍江 武漢 延邊

巨人網絡通訊聲明:本文標題《淺談Go語言多態的實現與interface使用》,本文關鍵詞  淺談,語,言多,態,的,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談Go語言多態的實現與interface使用》相關的同類信息!
  • 本頁收集關于淺談Go語言多態的實現與interface使用的相關信息資訊供網民參考!
  • 推薦文章
    日韩在线观看视频免费| 国产精品免费精品自在线观看| 精品国产一区二区三区久| 夜夜操天天爽| 韩国三级视频网站| 日韩专区亚洲综合久久| 日韩av成人| a级黄色毛片免费播放视频| 精品国产一区二区三区国产馆| 台湾毛片| 九九久久国产精品| 国产成人啪精品视频免费软件| 欧美1卡一卡二卡三新区| 日韩欧美一及在线播放| 国产成人精品综合在线| 亚洲精品久久玖玖玖玖| 一a一级片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 91麻豆精品国产高清在线| 日本伦理片网站| 国产一区二区精品在线观看| 色综合久久久久综合体桃花网| 天天色色色| 久久国产精品只做精品| 欧美日本韩国| 免费一级片在线观看| 欧美一区二区三区性| 久久精品免视看国产明星| 亚洲 国产精品 日韩| 可以免费看污视频的网站| 国产国产人免费视频成69堂| 亚洲天堂免费| 韩国三级视频网站| 毛片成人永久免费视频| 日韩专区亚洲综合久久| 国产精品123| 国产一区二区精品| 欧美大片毛片aaa免费看| 日本伦理片网站| 日本在线不卡视频| 午夜欧美成人久久久久久| 天天做人人爱夜夜爽2020| 一a一级片| 国产成人女人在线视频观看 | 99久久精品国产片| 九九久久国产精品大片| 国产精品自拍在线观看| 美女被草网站| 午夜在线亚洲| 青青青草影院| 尤物视频网站在线| 国产91精品一区二区| 午夜久久网| 亚洲 欧美 91| 精品久久久久久中文| 高清一级片| 欧美激情一区二区三区在线 | 精品国产三级a| 九九精品在线播放| 欧美激情一区二区三区在线 | 99久久精品国产片| 国产激情视频在线观看| 欧美一级视频免费观看| 免费一级生活片| 黄视频网站免费看| 国产a网| 国产福利免费视频| 999精品在线| 天天做日日干| 国产一区二区福利久久| 久久精品道一区二区三区| 韩国三级视频网站| 国产网站免费在线观看| 精品国产亚洲人成在线| 日本免费看视频| 国产精品123| 国产激情视频在线观看| 精品在线免费播放| 国产伦久视频免费观看视频| 国产a网| 精品毛片视频| 成人免费观看的视频黄页| 成人影视在线播放| 国产不卡在线播放| 可以免费看毛片的网站| 国产成+人+综合+亚洲不卡| 色综合久久久久综合体桃花网| 精品视频一区二区三区| 可以在线看黄的网站| 欧美另类videosbestsex视频| 久久99中文字幕| 亚洲第一视频在线播放| 毛片电影网| 黄视频网站免费看| 久久久久久久免费视频| 免费毛片基地| 国产综合91天堂亚洲国产| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲精品久久久中文字| 久久福利影视| 天天做日日爱| 精品久久久久久中文字幕一区 | 青草国产在线| 亚洲女人国产香蕉久久精品| 日韩在线观看视频免费| 欧美日本二区| 国产一级生活片| 亚洲精品久久久中文字| 天天色成人| 国产成人精品综合久久久| 欧美大片一区| 国产一区二区精品久| 国产成人精品影视| 国产一级生活片| 久久久成人网| 国产成人啪精品视频免费软件| 四虎影视库国产精品一区| 国产伦久视频免费观看视频| 精品国产一区二区三区久| 成人免费网站久久久| 四虎影视精品永久免费网站| 999久久66久6只有精品| 国产一区二区精品| 成人免费一级毛片在线播放视频| 在线观看导航| 天天做人人爱夜夜爽2020毛片| 国产福利免费视频| 四虎影视久久久| 国产成人精品综合在线| 免费国产在线视频| 青青青草影院 | 久久成人综合网| 亚洲第一视频在线播放| 成人av在线播放| 成人影视在线观看| 精品国产一区二区三区久| 韩国三级视频网站| 四虎影视库| 亚洲精品影院久久久久久| 久久精品人人做人人爽97| 久久99这里只有精品国产| 国产韩国精品一区二区三区| 香蕉视频一级| 久久99欧美| 日本特黄一级| 日韩在线观看免费| 高清一级毛片一本到免费观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久久久久久综合影视网| 国产成人啪精品| 色综合久久天天综合观看| 国产a网| 你懂的国产精品| 91麻豆精品国产片在线观看| 午夜家庭影院| 精品国产三级a| 精品在线免费播放| 台湾毛片| 国产极品精频在线观看| 国产高清在线精品一区二区| 九九久久99综合一区二区| 国产亚洲男人的天堂在线观看| 日日夜人人澡人人澡人人看免| 久久成人亚洲| 欧美a级片视频| 黄视频网站在线免费观看| 四虎论坛| 亚洲女初尝黑人巨高清在线观看| 你懂的福利视频| 台湾毛片| 欧美a级大片| 日韩中文字幕在线观看视频| 一本高清在线| 欧美1卡一卡二卡三新区| 高清一级片| 精品久久久久久中文字幕2017| 99久久精品国产片| 亚洲 激情| 精品视频一区二区| 黄色福利| 精品视频一区二区三区| 九九久久国产精品| 国产激情一区二区三区| 中文字幕Aⅴ资源网| 亚洲爆爽| 日韩一级黄色| 亚欧乱色一区二区三区| 免费国产在线视频| 成人高清视频免费观看| 99久久精品国产高清一区二区 | 午夜在线亚洲| 午夜欧美福利| 日韩一级黄色| 999久久66久6只有精品| 国产高清在线精品一区二区| 黄色福利| 久久久久久久网| 精品视频在线看| 久久久久久久久综合影视网| 999久久久免费精品国产牛牛|