亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang OOP 說明

Golang OOP 說明

Go
大話西游666 2023-03-29 15:14:51
我有兩個用 編寫的接口go,一個是另一個的子集type x interface {    a()}type y interface {    a()    b()}我也有一個結構,它有這樣的方法type z struct {    some string}func (s z) a() {    // do stuff}func (s z) b() {    // do stuff}我對此有幾個問題,即:我說 z 實現了 x 和 y 是對的嗎?以這種方式實現多個接口的一個結構的 OOP 概念是什么?我試著問了幾位同事,他們似乎傾向于polymorphism作為答案,雖然他們不太確定。多態性的維基百科條目說它“是為不同類型的實體提供單一接口”,但這對我來說就像是直接相反。我還在其他來源(例如this)中發現 Go “不是真正的 OOP 語言”。
查看完整描述

4 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

是的,z實現了x和y。您可以通過使用變量聲明將具體類型分配給接口類型來證明:


var _ x = z{}

var _ y = z{}

這為您提供了編譯時檢查,以確保類型實現了您想要的接口。


作為旁注,如果您明確想y成為x + some more methods,那么這樣寫是有意義的:


interface y {

    x

    b()

}

關于命名,如果一個類型實現了兩個共享某些方法的不同接口,我會這樣稱呼它——一個實現兩個不同接口的類型。一個接口是另一個接口的子集并不重要。


此外,在 Go 中,類型(以及非結構類型)在定義時不與接口相關聯。即使一個類型不是為了實現某個接口而編寫的,您也可以通過定義具有不同名稱和/或該類型的不同方法組合的新接口來使其實現任意數量的接口。這使得為概念命名變得更加困難——當接口稍后可能在另一個包中定義時,您如何在類型定義時知道名稱?


查看完整回答
反對 回復 2023-03-29
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

一開始我很難掌握 Go 接口的竅門。我有多年的 Java、C++、Python 經驗……恕我直言,充分利用 Go 和任何其他新語言的最佳方法是不要用 Go 語法編寫 Java 或 C++。了解 Go 中的事物是如何工作的并使用它。術語可能不是精確的一對一映射,但這無關緊要。

將 Go 接口視為一組對某些數據組(結構)進行操作的方法簽名。 類似于Java 接口只是類上的一組方法簽名。主要區別在于,在 Go 中,你不需要指定結構implements接口,語言會為你做。如果您在結構上指定方法,它會自動實現接口。


查看完整回答
反對 回復 2023-03-29
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

您說 z 實現了這兩個接口是正確的。

接口本身是一個通用的編程概念,并不局限于面向對象的語言。一些面向對象的語言(如 Java 和 Go)提供了一種定義和實現接口的方法,而其他語言則沒有。

它實際上是一種多態性,因為您說的是一組特定的函數或方法可能由不同的數據結構類型實現。正如維基百科文章所建議的那樣。它也可以被認為是類型抽象。

Go 能夠支持面向對象和面向過程的編程風格。它被認為是一種面向對象的編程語言。

Go 是一種強類型語言,接口允許 Go 程序員通過他們的方法定義類型,以及通過數據結構定義類型的其他方式。


查看完整回答
反對 回復 2023-03-29
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

Go 中沒有繼承的概念。它促進了組合而不是繼承。

來自 Go 常見問題解答:

沒有類型層次結構:類型就是這樣,它們不必聲明它們的關系。這些簡化使 Go 既具有表現力又易于理解,而不會犧牲復雜性。


查看完整回答
反對 回復 2023-03-29
  • 4 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號